【问题标题】:Convert Image Pixel Data to Coordinate Array将图像像素数据转换为坐标数组
【发布时间】:2015-01-17 07:54:34
【问题描述】:

我有以下代码将图像绘制到画布并获取像素数据:

   var canvas=$('#canvas'),
       ctx=canvas.getContext('2d');

    ctx.drawImage(img, 0, 0);
    var data=ctx.getImageData(0, 0, canvas.width, canvas.height);

这会拉取RGBA 值,我需要将这些值存储到一个数组中,我将能够使用 X/Y 坐标访问该数组。绘制到画布上的图像是黑白图像 - 所以它会检查X,Y 处的像素是黑色还是白色 - 比如:

imageArray[x][y]

我不知道如何循环像素数据并将其保存到2d 数组,因此我可以通过坐标调用它。

【问题讨论】:

    标签: javascript html loops canvas


    【解决方案1】:

    ctx.getImageData 返回一个包含.data 属性的对象。

    该数据属性是一个数组,其中已经包含您要查找的所有像素颜色。

    // get the imageData object
    var imageData=ctx.getImageData(0, 0, canvas.width, canvas.height);
    
    // get the pixel color data array
    var data=imageData.data;
    

    data 数组是一个长数组,其中包含画布上每个像素的红色、绿色、蓝色和 alpha(不透明度)值。 data 数组的形状如下:

    // top left pixel [0,0]
    data[0]: Red value for pixel [0,0],
    data[1]: Green value for pixel [0,0],
    data[2]: Blue value for pixel [0,0],
    data[3]: Alpha value for pixel [0,0],
    
    // next pixel rightward [1,0]
    data[4]: Red value for pixel [1,0],
    data[5]: Green value for pixel [1,0],
    data[6]: Blue value for pixel [1,0],
    data[7]: Alpha value for pixel [1,0],
    
    // and so on for each pixel on the canvas
    ...
    

    您可以像这样在data 中获取任何 [x,y] 像素的位置:

    // the data[] array position for pixel [x,y]
    var n = y * canvas.width + x;
    

    然后您可以像这样获取该像素的红色、绿色、蓝色和 alpha 值:

    var red=data[n];
    var green=data[n+1];
    var blue=data[n+2];
    var alpha=data[n+3];
    

    【讨论】:

      【解决方案2】:

      您可以做的是遍历整个图像数据数组并提取您需要的值:

      每个像素为其 rgba 值占用数组中的四个空间,因此我们可以循环遍历像素总数并每次从数组中获取四个值。

      您可以通过将当前索引除以高度来获得 y 值(或像素所在的行),并通过使用 y 值从当前索引中减去行来获得 x(或列像素所在的行),留下x。

      var pixels = imageData.data;
      var w = imageData.width;
      var h = imageData.height;
      
      var l = w * h;
      for (var i = 0; i < l; i++) {
          // get color of pixel
          var r = pixels[i*4]; // Red
          var g = pixels[i*4+1]; // Green
          var b = pixels[i*4+2]; // Blue
          var a = pixels[i*4+3]; // Alpha
      
          // get the position of pixel
          var y = parseInt(i / w, 10);
          var x = i - y * w;
      }
      

      【讨论】:

      • 你能扭转这个过程吗? (即在imageData.data 数组中找到像素的颜色“r”位置)?
      • 当然。您可以调用ctx.getImageData(x, y, 1, 1) 以返回xy 像素的rgba 或执行var i = y * w + x * 4 之类的操作(我认为这是正确的!)
      • 是的,我相信这是正确的(我最终创建了这个:function getpixel(x,y){ var width = canvas.width; var id = x+(y*width); return pixels[id]; } 请记住,我创建了一个像素阵列 - 每个像素包含 4 个颜色通道 RGBA) - 无论如何谢谢:- )
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多