处理透明度是否支持去除背景?

Does Processing transparency support removing backgrounds?

我有一张绿色背景的图片。

我用这个功能去除了背景。

public void removeBackground(PImage img, color c, float thres) {
  colorMode(HSB);
  for(int i = 0; i < img.width; i++){
    for(int j = 0; j < img.height; j++){
      color cp = img.get(i, j);
      //threshold accounts for compression
      if(abs(hue(cp) - hue(c)) < thres){
        img.set(i, j, color(0,0,0,0));
      }
    }
  }
}

使用这些参数,我尝试删除背景。

PImage FBSprite;
public void settings() {
  size(500, 500);
}

void setup(){
  FBSprite = loadImage("FlappyBirdSprite.jpg");
  FBSprite.resize(50, 0);
  removeBackground(FBSprite, FBSprite.get(0,0), 0.5);
  image(FBSprite, 0, 0);
}

void draw(){
  background(200);
  image(FBSprite, 0, 0);
}

背景变成黑色而不是透明。

ARGB 结果:

具有 1 个 alpha 的 HSB 结果:

我没有将要移除的像素的 alpha 设置为 0,而是将 alpha 设置为 1。alpha 太小了,您看不到边框。

你会喜欢这个:改变这一行

colorMode(HSB);

为此:

colorMode(ARGB);

它应该可以解决问题。刚刚发生了什么?除非你需要 在那个非常特定的时间点在 HSB 工作,否则没有意义。 ARGB 与 RGB 类似,但它具有 ALPHA 设置,或者如果您愿意,也可以设置透明度。自从您像这样设置 color(0,0,0,0) 后,您似乎已经准备好在 ARGB 中工作,所以这可能是一个 copy and paste programming 问题。或者也许你只是没有注意到。它总是发生在我身上。但是,如果这是第一件事,请尝试在将来对此类问题保持敏锐的眼光。除了众所周知的意大利面条代码之外,大多数人不会谈论其他糟糕的设计模式,但是 cut and paste programming 是真实存在的并且会造成很大伤害,尤其是当您使用一些文档不存在的内部平台时。这不是发生在我身上。

玩得开心!