2011-12-03 27 views
0

我目前在画布上使用fillRect方法,像这样设置各个像素的循环中:在canavs的imageData设置一个像素对于给定的X和Y

context.fillStyle = "rgba("+colourR+","+colourG+","+colourB+",255)"; 
context.fillRect(x, y, 1, 1) 

这种方法效果很好,但它,和putImageData,是非常缓慢的。所以我决定尝试和内环路单独设置的像素,然后使用putImageData一个呼叫时准备输出到屏幕上,就像这样:

var screenImageData = context.getImageData(0,0,800,600); 
var pixelBuffer = screenImageData.data;  
pixelBuffer[(x*4) + (y*(screenImageData.width * 4))] = colourR; 
pixelBuffer[(x*4) + (y*(screenImageData.width * 4)) + 1] = colourG; 
pixelBuffer[(x*4) + (y*(screenImageData.width * 4)) + 2] = colourB; 
pixelBuffer[(x*4) + (y*(screenImageData.width * 4)) + 3] = 255; 

... 

context.putImageData(screenImageData,0,0); 

然而,这会产生一个完全不同的输出fillRect方法(它看起来像混乱垃圾)。我在这里做错了什么?

+0

为什么在这种情况下您需要使用getImageData()和putImageData()? – anson

+0

你可以把测试用具放在什么地方吗? – Nickolay

+0

你为什么要做'screenImageData.width * 4'? –

回答

0

这里的问题在于x和y的计算方式,显然putImageData将它们自动转换为整数。在它们上使用Math.floor是所有必需的。

相关问题