【问题标题】:Html5 Canvas: alternative for drawImage()Html5 Canvas:drawImage() 的替代方案
【发布时间】:2014-08-29 17:35:22
【问题描述】:

由于我在画布的默认 scale() 函数中遇到了一些舍入问题*,因此我为画布实现了自己的矩阵变换。这工作正常,唯一的例外是,我无法旋转图像,因为 drawImage() 函数只能用图片的左上角参数化。

还有其他方法可以在画布上绘制图像吗?一种方法,至少可以用左上角和右下角的坐标参数化?,这样我就可以手动旋转坐标了?

*问题是缩放比例

【问题讨论】:

  • 您可以在 drawImage() 之前使用 Context2D.transform(... whole matrix ...)。一切都应该工作。有什么问题?
  • context.rotate 没有其他选择。也许尝试修复那 1 个像素的差距?
  • 1 像素间隙是由浮点数缩放整数产生的。如果您将 1 缩放 1/3,您最终会得到 0.333333……但像素是离散的。我在矩阵中有 1/3,所以如果我使用 Context2D.transform() 而不是 scale(),我认为它不会解决问题。我必须对转换的结果进行四舍五入(矩阵乘法)。
  • 一个选项:将drawImage的宽度和高度增加1/2像素。
  • 是的,将矩形(或图像)的大小增加 1/2 像素以适应间隙。

标签: javascript html canvas


【解决方案1】:

根据您在 cmets 中的小提琴,您可以使用内存中的画布作为后台缓冲区以正常大小绘制您需要的内容,然后缩放主画布的上下文并使用 drawImage 绘制缩放后的结果.

Live Demo

var canvas = document.getElementById('c');
var context = canvas.getContext('2d');

var backBuffer = document.createElement("canvas"),
    bCtx = backBuffer.getContext("2d");

paint = function (x, y, scale) {

    bCtx.clearRect(0,0,backBuffer.width,backBuffer.height);;
    bCtx.beginPath();
    bCtx.rect(x, y, 30, 30);
    bCtx.fillStyle = 'black';
    bCtx.fill();

    bCtx.beginPath();
    bCtx.rect(x + 30, y, 30, 30);
    bCtx.fillStyle = 'black';
    bCtx.fill();

    context.save();
    context.scale(scale,scale);
    context.drawImage(backBuffer,0,0);
    context.restore();
}

paint(10, 10, 1);
paint(10, 70, .66);

【讨论】:

  • 这确实可行。我想将状态堆栈与几个转换一起使用,其中较低堆栈层的转换也适用于较高堆栈层。如果将转换的某些部分应用到不同的画布上,这可能会导致代码非常复杂......这就是为什么我试图找到另一个解决方案......但也许没有......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2015-03-03
  • 2015-09-25
相关资源
最近更新 更多