How to create a new ImageData object independently?

后端 未结 4 1127
灰色年华
灰色年华 2020-12-13 15:23

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?

相关标签:
4条回答
  • 2020-12-13 16:06

    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.

    0 讨论(0)
  • 2020-12-13 16:15

    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);
    
    0 讨论(0)
  • 2020-12-13 16:27

    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.

    0 讨论(0)
  • 2020-12-13 16:30

    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);
    
    0 讨论(0)
提交回复
热议问题