【问题标题】:Looping through pixels in an image循环遍历图像中的像素
【发布时间】:2013-07-16 21:19:52
【问题描述】:

我的项目是将图像输入到 HTML 页面中的画布标签中,然后循环遍历像素和像素的 RGBA 值。在循环遍历红色值时,像素中的每四个值,我想记录代表白色像素的像素的位置。现在,我用从这个博客http://www.phpied.com/photo-canvas-tag-flip/ 获得的一些代码下载了图像。

他在另一篇文章中给出了一些关于如何循环遍历像素并记录我想要记录的信息的代码,但我不明白,我不想在不知道什么的情况下复制他的代码这是我正在做的。那么任何人都可以解释他正在使用的方法,或者向我展示另一种方法来做他正在做的事情吗?这是另一个帖子http://www.phpied.com/pixel-manipulation-in-canvas/的链接。

【问题讨论】:

    标签: javascript html image-processing canvas for-loop


    【解决方案1】:

    这很简单。

    画布的所有像素数据都按顺序存储在一个数组中。

    第一个像素的数据占用数组元素#0-3 (red=0/green=1/blue=2/alpha=3)。

    第二个像素的数据占用数组元素#4-7 (red=4/green=5/blue=6/alpha=7)。

    等等……

    您可以使用 context.getImageData() 并通过数组枚举来加载该像素数据:

    const imgData = context.getImageData(0, 0, canvas.width, canvas.height);
    const data = imgData.data;
    
    // enumerate all pixels
    // each pixel's r,g,b,a datum are stored in separate sequential array elements
    
    for(let i = 0; i < data.length; i += 4) {
      const red = data[i];
      const green = data[i + 1];
      const blue = data[i + 2];
      const alpha = data[i + 3];
    }
    

    您还可以更改这些数组值,然后使用context.putImageData() 将数组保存回图像。

    // save any altered pixel data back to the context
    // the image will reflect any changes you made
    
    context.putImageData(imgData, 0, 0);
    

    然后图像将根据您对其像素阵列所做的更改而更改。

    每个像素包含 4 个分量红色、绿色、蓝色和 alpha - 每个分量都是数字 0-255。循环从左上角到右下角开始。

    【讨论】:

    【解决方案2】:

    我建议您使用图像处理框架,以便专注于算法而不是操作值数组。一些框架:

    在 MarvinJ 的情况下,您可以简单地遍历像素迭代列和行坐标。我使用方法 getIntComponentX() 来访问颜色组件。

    for(var y=0; y<image.getHeight(); y++){
        for(var x=0; x<image.getWidth(); x++){
            var red = image.getIntComponent0(x,y);
            var green = image.getIntComponent1(x,y);
            var blue = image.getIntComponent2(x,y);
        }
    }
    

    因此,您无需担心像素数据的表示方式。为了检查一个像素是否为白色:

    // Is white?
    if(red >= 250 && blue >= 250 && green >= 250){
        console.log("Pixel at "+x+","+y+" is white");
    }
    

    可运行示例:

    var canvas = document.getElementById("canvas");
    image = new MarvinImage();
    image.load("https://i.imgur.com/eLZVbQG.png", imageLoaded);
    
    function imageLoaded(){
      
      var whitePixels=0;
      for(var y=0; y<image.getHeight(); y++){
        for(var x=0; x<image.getWidth(); x++){
          var red = image.getIntComponent0(x,y);
          var green = image.getIntComponent1(x,y);
          var blue = image.getIntComponent2(x,y);
          var alpha = image.getAlphaComponent(x,y);
          
          // Is white?
          if(red >= 250 && green >= 250 && blue >= 250 && alpha > 0){
            whitePixels++;
          }
        }
      }
      
      image.draw(canvas);
      
      document.getElementById("result").innerHTML = "white pixels: "+whitePixels;
    }
    <script src="https://www.marvinj.org/releases/marvinj-0.7.js"></script>
    <canvas id="canvas" width="500" height="344"></canvas>
    <div id="result"></div>

    【讨论】:

    • 使用 MarvinJ 执行此操作非常高效。感谢您提供此解决方案!
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2015-05-09
    • 2011-10-05
    • 2015-01-15
    • 2012-07-25
    相关资源
    最近更新 更多