How to create a new ImageData object independently?

瘦欲@ 提交于 2019-11-28 19:37:13

This is interesting problem... You can't just create ImageData object:

var test = new ImageData(); // TypeError: Illegal constructor

I have also tried:

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

but as described in MDN data property is readonly.

So I think the only way is to create object and set data property with iteration:

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];
}

Update: I have discovered the set method in data property of ImageData, so solution is very simple:

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

Newest versions of Chrome and Firefox already support ImageData constructor. You can find its definition at MDN.

For other browsers you can create this constructor yourself:

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

You can use it like this:

var imgData1 = new ImageData(data, width, height);
var imgData2 = new ImageData(width, height);

The ImageData constructor is finally becoming available in Chrome and Firefox (see the compatibility table on mdn). There are two forms:

var imageData = new ImageData(width, height);

and if you want to build an instance with a UInt8ClampedArray object data:

var imageData = new ImageData(data, width, height); // height is optional

For compatibility reasons, it's best to use createImageData via a canvas 2D context though, as demonstrated in other answers.

There is the createImageData() method. But for this you need the context of an existing canvas.

var myImageData = context.createImageData(cssWidth, cssHeight);

See here for more information.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!