在处理2.0中不加载图片中的白色像素

时间:2014-02-23 09:21:39

标签: performance image-processing processing pixels

这适用于编程语言Processing(2.0)。

假设我希望加载非方形图像(让我们使用绿色圆圈作为示例)。如果我在黑色背景上加载它,你可以看到图像的白色方块(也就是图像的所有部分都不是绿色圆圈)。我将如何有效地删除它们?

它无法想到一种有效的方法,我会做到每秒大约25次的数百张图片(因为它们会移动)。

非常感谢任何帮助,代码效率越高越好。

2 个答案:

答案 0 :(得分:1)

正如@ user3342987所说,你可以遍历图像的像素,看看每个像素是否为白色。但是,值得注意的是255是白色(不是0,黑色)。您也不应该像他们建议的那样对替换颜色进行硬编码 - 如果图像在条纹背景上移动会怎么样?最好的方法是使用图像的alpha通道将所有白色像素更改为透明像素。此外,既然你提到你会“每秒约25次”这样做,你就不应该多次进行这些检查 - 每次都是一样的并且会浪费。相反,在首次加载图像时执行此操作,如下所示(未经测试):

PImage[] images;

void setup(){
  size(400,400);
  images = new PImage[10];
  for(int i = 0; i < images.length; i++){
    // example filenames
    PImage img = loadImage("img" + i + ".jpg");
    img.beginDraw();
    img.loadPixels();
    for(int p = 0; p < img.pixels.length; p++){
      //color(255,255,255) is white
      if(img.pixels[p] == color(255,255,255)){
        img.pixels[p] = color(0,0); // set it to transparent (first number is meaningless)
      }
    }
    img.updatePixels();
    img.endDraw();
    images[i] = img;
  }
}
void draw(){
  //draw the images as normal, the white pixels are now transparent
}

因此,这会导致draw()期间没有延迟,因为您在setup()中删除了白色像素。无论你绘制的是什么,图像都会显示出来。

还值得一提的是,某些图像文件类型具有内置的Alpha通道(例如,PNG格式),因此您还可以在某些图像编辑器中将白色像素更改为透明,并将这些编辑后的文件用于草图。然后你的草图不必在每次启动时编辑它们。

答案 1 :(得分:0)

像素存储在Pixels []数组中,您可以使用for循环检查该值是否为0(又称白色)。如果它是白色加载它作为黑色背景。