我正面临着我不明白的剧本中的错误。我在修改它的数据后尝试修改canvas imageData。数据是Int32Array
var clampedArray = new Uint8ClampedArray(data);
var newImgData=ctx.createImageData( WIDTH, HEIGHT);
newImgData.data = clampedArray;
console.log(newImgData.data, clampedArray);
ctx.putImageData(newImgData,0 ,0);
此console.log()返回:
Uint8ClampedArray { 0=0, 1=0, 2=0, plus...} Uint8ClampedArray { 0=37, 1=54, 2=18, plus...}
所以newImageData.data不会被这一行修改:
newImgData.data = clampedArray;
到底是什么?我应该错过什么,但是什么?
答案 0 :(得分:1)
使用不同的数组交换imageData.data一直存在问题 - 可能是因为画布中内置了隐藏的跨域安全保护措施。
更可靠的是将每个新数据元素复制到imageData.data数组中:
http://jsfiddle.net/m1erickson/s9DA4/
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var WIDTH=canvas.width;
var HEIGHT=canvas.height;
var data=[];
for(var i=0;i<WIDTH*HEIGHT;i++){
data=data.concat([0,255,0,255]);
}
var newImgData=ctx.createImageData(WIDTH,HEIGHT);
for(var i=0;i<newImgData.data.length;i+=4){
newImgData.data[i+0]=data[i+0];
newImgData.data[i+1]=data[i+1];
newImgData.data[i+2]=data[i+2];
newImgData.data[i+3]=data[i+3];
}
ctx.putImageData(newImgData,0 ,0);
答案 1 :(得分:1)
设置新图像数据的正确方法是使用set()方法:
newImgData.data.set(clampedArray);
答案 2 :(得分:0)
如果数组使用数字,则可以省略Uint8ClampedArray
-JS自动将其强制转换为0-255个整数,例如data=[10.5,1000,-10,4] -> [10,255,0,4]
,因此您可以编写:
newImgData.data.set(data);