HTML5 Canvas没有显式设置单个像素的方法。
可以使用非常短的行设置像素,但反字符和行大写可能会干扰。
另一种方法可能是创建一个小的ImageData对象,并使用:
context.putImageData(data, x, y)
把它放在合适的位置。
有人能描述一种高效可靠的方法吗?
HTML5 Canvas没有显式设置单个像素的方法。
可以使用非常短的行设置像素,但反字符和行大写可能会干扰。
另一种方法可能是创建一个小的ImageData对象,并使用:
context.putImageData(data, x, y)
把它放在合适的位置。
有人能描述一种高效可靠的方法吗?
当前回答
纯粹出于诊断目的,我使用这个简单的函数。
请注意。如果不使用整数坐标,得到的图像是模糊的。
setPixel (context, 100, 100, 'blue');
function setPixel (ctx, x, y, c) {
// integer coordinates are required.
ctx.save ();
ctx.fillStyle = c;
ctx.fillRect (x, y, 1, 1);
ctx.restore ();
}
其他回答
嗯,你也可以只做一个1像素宽的线,长度为1像素,让它的方向沿着一个轴移动。
ctx.beginPath();
ctx.lineWidth = 1; // one pixel wide
ctx.strokeStyle = rgba(...);
ctx.moveTo(50,25); // positioned at 50,25
ctx.lineTo(51,25); // one pixel long
ctx.stroke();
长方形呢?这比创建ImageData对象更有效。
纯粹出于诊断目的,我使用这个简单的函数。
请注意。如果不使用整数坐标,得到的图像是模糊的。
setPixel (context, 100, 100, 'blue');
function setPixel (ctx, x, y, c) {
// integer coordinates are required.
ctx.save ();
ctx.fillStyle = c;
ctx.fillRect (x, y, 1, 1);
ctx.restore ();
}
由于不同的浏览器似乎更喜欢不同的方法,也许在加载过程中对所有这三种方法进行一个较小的测试,以找出使用哪个方法最好,然后在整个应用程序中使用该方法是有意义的。
我没有考虑过fillRect(),但答案促使我对putImage()进行基准测试。
在(旧的)MacBook Pro上使用Chrome 9.0.597.84在随机位置放置100,000个随机颜色的像素,使用putImage()只需不到100毫秒,但使用fillRect()需要近900毫秒。(基准代码在http://pastebin.com/4ijVKJcC)。
如果我在循环之外选择一种颜色,并在随机位置绘制该颜色,putImage()需要59ms而fillRect()需要102ms。
在rgb(…)语法中生成和解析CSS颜色规范的开销似乎是造成大部分差异的原因。
另一方面,将原始RGB值直接放入ImageData块中不需要字符串处理或解析。