首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法更改画布imageData

无法更改画布imageData
EN

Stack Overflow用户
提问于 2014-07-14 16:28:42
回答 3查看 1.2K关注 0票数 3

我在我的剧本里遇到了一个我不明白的错误。在修改了画布imageData的数据后,我尝试修改它。数据是一个Int32Array

代码语言:javascript
复制
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()返回:

代码语言:javascript
复制
 Uint8ClampedArray { 0=0, 1=0, 2=0, plus...} Uint8ClampedArray { 0=37, 1=54, 2=18, plus...}

因此,newImageData.data不是由以下行修改的:

代码语言:javascript
复制
newImgData.data = clampedArray;

搞什么鬼?我应该错过一些东西,但是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-18 15:14:45

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

代码语言:javascript
复制
newImgData.data.set(clampedArray);
票数 3
EN

Stack Overflow用户

发布于 2014-07-14 17:10:38

用不同的数组交换imageData.data一直是个问题--也许是因为在画布中内置了隐藏的跨域安全保障措施。

更可靠的方法是将每个新的数据元素复制到imageData.data数组中:

http://jsfiddle.net/m1erickson/s9DA4/

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2018-12-01 18:43:57

如果数组使用数字- JS将其自动转换为0-255整数,您可以省略Uint8ClampedArray,例如data=[10.5,1000,-10,4] -> [10,255,0,4],这样您就可以编写:

代码语言:javascript
复制
newImgData.data.set(data);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24741285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档