Copy imageData by value in JavaScript

前端 未结 3 1264
暖寄归人
暖寄归人 2020-12-31 08:52

In my application I have a function that processes Canvas ImageData. It looks something like this:

function processData(imagedata, filters) {
  var data = im         


        
相关标签:
3条回答
  • 2020-12-31 09:16

    Just thought I would add one more solution to this thread along with a link to the duplicate thread on which I found the solution. I am re-posting it here because, in my case it offered an advantage.

    They propose simply cloning the data of the ImageData object with

    var dataCopy = new Uint8ClampedArray(imageData.data);
    

    Later, if you want to restore this data to an ImageObject you use

    imageData.data.set(dataCopy);
    

    imageData may be the original instance from which you cloned the data or a new ImageData object.

    In my case this method is better because I am working with ImageData objects inside of a WorkerThread. WorekerThreads are not allowed access to the canvas object or its context so as far as I can tell the techniques here would not help me. This solution; however, did the trick. Thanks All.

    Duplicate Thread Offering Other Solutions.

    0 讨论(0)
  • 2020-12-31 09:25

    According to the latest specification ImageData object data attribute is initialized to a Uint8ClampedArray object (instead of earlier used CanvasPixelArray object), so data within ImageData could be easily copied with set method:

    function copyImageData(ctx, src)
    {
        var dst = ctx.createImageData(src.width, src.height);
        dst.data.set(src.data);
        return dst;
    }
    
    0 讨论(0)
  • 2020-12-31 09:27

    I think you should be able to create a copy pretty easily:

    function copyImageData(context, original) {
      var rv = context.createImageData(original.width, original.height);
      // would 
      //   rv.data = Array.prototype.slice.call(original.data, 0);
      // work?
      for (var i = 0; i < original.data.length; ++i)
        rv.data[i] = original.data[i];
      return rv;
    }
    

    (The first argument is the graphics context.)

    Then you can call "processImageData" with a copy:

    var newImage = processImageData(copyImageData(context, imageData));
    

    edit — I'll try a fiddle to see whether ".slice()" works on the "data" array - I think it will but it's always good to make sure.

    0 讨论(0)
提交回复
热议问题