Search code examples
javascriptcanvashtml5-canvasgetimagedata

How to create a new ImageData object independently?


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.


Solution

  • 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);