Search code examples
javascripthtml5-canvas

ImageData data assignment in Strict Mode


Let's say I have such PoC code snippet for working with canvas raw pixel data

(function(){
  'use strict';
  var img = document.createElement("canvas").getContext("2d").getImageData(0, 0, 1, 1);
  var imgData = img.data;
  img.data = imgData;
})();

The problem is that I get a reasonable error (I've checked in the latest Chrome and FF)

TypeError: Cannot assign to read only property 'data' of #<ImageData>

So, I can disable Strict Mode and everything will become perfect, but is there any possibility to implement this in Strict Mode? Maybe i just didn't find a documentation on setter for data?

Thanks!


Solution

  • Read comments in code:

    (function(){
      'use strict';
      var canvas=document.createElement("canvas");
      // canvas object must have size
      var w=canvas.width=100;
      var h=canvas.height=50;
      var ctx=canvas.getContext("2d");
      var imgData=ctx.getImageData(0,0,w,h);
      // In next line you retrieve array of RGBA values where each array element
      // is value between 0 and 255. Array size is size imgData.width*imgData.height
      var pixelData = imgData.data;
      pixelData[0] = 128; // Store 128 for Red channel of first pixel: (0,0)
      pixelData[5] = 128; // Store 128 for Green channel of second pixel
      imgData.data = pixelData; // Error
    })();
    

    You can also use putImageData method to modify content of CANVAS using another CanvasImageData object:

      var newImgData=ctx.createImageData(w,h);
      ctx.putImageData(newImgData,0,0);
    

    Read about CanvasImageData in MDN: https://developer.mozilla.org/en/DOM/ImageData and in MSDN: http://msdn.microsoft.com/en-us/library/ie/ff974957%28v=vs.85%29.aspx

    HTML5 canvas in MSDN: http://msdn.microsoft.com/en-us/library/ie/hh771733%28v=vs.85%29.aspx