在JavaScript中,您可以使用Uint8ClampedArray
直接操作图像的像素。在将该图像渲染到画布之前,您必须:
创建ImageData
对象。
使用Uint8ClampedArray
将ImageData
呈现给ImageData.data.set
个对象。
使用ImageData
将context.putImageData
对象绘制到画布上。
因此,从你的图像Uint8ClampedArray
到实际在屏幕上看到它,它需要不少于3次O(N)复制操作。对于大图像,这可能是非常有害的。一种解决方案是缓存ImageData对象,并将指针imageData.data
替换为Uint8ClampedArray
- 但imageData.data
是只读的!有没有办法更有效地做到这一点?
答案 0 :(得分:5)
根据MDN's page on ImageData
,ImageData(array, width, height)
构造函数采用第一个参数
包含图像基础像素表示的
Uint8ClampedArray
。
快速测试验证此参数是否被引用(即未复制)用作ImageData
的{{1}}属性。此测试记录data
:
true
因此,您可以通过使用引用var arr = new Uint8ClampedArray([0,0,0,0]);
var idata = new ImageData(arr,1,1);
console.log(idata.data === arr);
对象的ImageData
属性构建data
对象来消除第二步。