无法更改画布的 imageData。

3
我遇到了一份脚本中的错误,但我并不理解。我尝试在修改数据后修改画布的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;

什么鬼?我可能漏掉了什么,但是是什么呢?

3个回答

3

设置新图像数据的正确方法是使用set()方法:

newImgData.data.set(clampedArray);

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);

0

如果您的数组使用数字,则可以省略Uint8ClampedArray - JS会自动将其转换为0-255的整数,例如data=[10.5,1000,-10,4] -> [10,255,0,4],因此您只需编写:

newImgData.data.set(data);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接