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