HTML5 Canvas没有显式设置单个像素的方法。
可以使用非常短的行设置像素,但反字符和行大写可能会干扰。
另一种方法可能是创建一个小的ImageData对象,并使用:
context.putImageData(data, x, y)
把它放在合适的位置。
有人能描述一种高效可靠的方法吗?
HTML5 Canvas没有显式设置单个像素的方法。
可以使用非常短的行设置像素,但反字符和行大写可能会干扰。
另一种方法可能是创建一个小的ImageData对象,并使用:
context.putImageData(data, x, y)
把它放在合适的位置。
有人能描述一种高效可靠的方法吗?
当前回答
一种没有提到的方法是使用getImageData,然后使用putImageData。 这种方法很适合当你想要画很多的时候,快速。 http://next.plnkr.co/edit/mfNyalsAR2MWkccr
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var canvasWidth = canvas.width;
var canvasHeight = canvas.height;
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
var id = ctx.getImageData(0, 0, canvasWidth, canvasHeight);
var pixels = id.data;
var x = Math.floor(Math.random() * canvasWidth);
var y = Math.floor(Math.random() * canvasHeight);
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
var off = (y * id.width + x) * 4;
pixels[off] = r;
pixels[off + 1] = g;
pixels[off + 2] = b;
pixels[off + 3] = 255;
ctx.putImageData(id, 0, 0);
其他回答
像sdleihssirhc说的那样画一个矩形!
ctx.fillRect (10, 10, 1, 1);
^——应该在x:10, y:10处画一个1x1的矩形
长方形呢?这比创建ImageData对象更有效。
由于不同的浏览器似乎更喜欢不同的方法,也许在加载过程中对所有这三种方法进行一个较小的测试,以找出使用哪个方法最好,然后在整个应用程序中使用该方法是有意义的。
为了完成Phrogz非常彻底的回答,fillRect()和putImageData()之间有一个关键的区别。 第一个使用上下文通过添加一个矩形(不是像素)来绘制,使用fillStyle alpha值和上下文globalAlpha和转换矩阵,行大写等。 第二个替换整个像素集(可能是一个,但为什么?) 正如您在jsperf上看到的那样,结果是不同的。
没有人想一次只设置一个像素(也就是说在屏幕上绘制)。这就是为什么没有特定的API来做到这一点(这是正确的)。 在性能方面,如果目标是生成一张图片(例如光线跟踪软件),你总是想使用一个由getImageData()获得的数组,这是一个优化的Uint8Array。然后使用setTimeout/seTInterval每秒调用putImageData()一次或几次。
如果你担心速度,那么你也可以考虑WebGL。