如何独立创建一个新的ImageData对象?

Lik*_*hit 15 javascript canvas getimagedata html5-canvas

我想在代码中创建一个新的ImageData对象.如果我Uint8ClampedArray想要制作一个图像对象,那么最好的方法是什么?

我想我可以创建一个新的canvas元素,提取它的ImageData并覆盖它的数据属性,但这似乎是一个错误的方法.

如果我可以直接使用ImageData构造函数会很好,但我无法弄清楚如何.

ham*_*czu 36

这是一个有趣的问题......你不能只创建ImageData对象:

var test = new ImageData(); // TypeError: Illegal constructor
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

var imageData= context.createImageData(width, height);
imageData.data = mydata; // TypeError: Cannot assign to read only property 'data' of #<ImageData> 
Run Code Online (Sandbox Code Playgroud)

但正如MDN中 所述,data属性是readonly.

所以我认为唯一的方法是使用迭代创建对象和设置数据属性:

var canvas = document.createElement('canvas');
var imageData = canvas.getContext('2d').createImageData(width, height);
for(var i = 0; i < myData.length; i++){
    imageData.data[i] = myData[i];
}
Run Code Online (Sandbox Code Playgroud)

更新:setdataImageData的属性中发现了方法,因此解决方案非常简单:

var canvas = document.createElement('canvas');
var imageData = canvas.getContext('2d').createImageData(width, height);
imageData.data.set(myData);
Run Code Online (Sandbox Code Playgroud)


Luk*_*uka 7

最新版本的Chrome和Firefox已经支持ImageData构造函数.您可以在MDN上找到它的定义.

对于其他浏览器,您可以自己创建此构造函数:

function ImageData() {
    var i = 0;
    if(arguments[0] instanceof Uint8ClampedArray) {
        var data = arguments[i++];
    }
    var width = arguments[i++];
    var height = arguments[i];      

    var canvas = document.createElement('canvas');
    canvas.width = width;
    canvas.height = height;
    var ctx = canvas.getContext('2d');
    var imageData = ctx.createImageData(width, height);
    if(data) imageData.data.set(data);
    return imageData;
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

var imgData1 = new ImageData(data, width, height);
var imgData2 = new ImageData(width, height);
Run Code Online (Sandbox Code Playgroud)