I want to create a new ImageData object in code. If I have a Uint8ClampedArray
out of which I want to make an image object, what is the best way to do it?
I guess I could make a new canvas element, extract its ImageData and overwrite its data attribute, but that seems like a wrong approach.
It would be great if I could use the ImageData constructor directly, but I can't figure out how to.
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.
来源:https://stackoverflow.com/questions/13626465/how-to-create-a-new-imagedata-object-independently