转换颜色

时间:2013-07-18 17:38:13

标签: java colors

我正在尝试为我的游戏编写一个方法,该方法将采用图像,旧颜色的十六进制值和新颜色的十六进制值,然后将旧颜色的所有像素转换为新颜色。现在,该方法将整个图像绘制为新颜色,就像if语句根本不起作用一样。这个方法:

private void convertColors(BufferedImage img, int oldColor, int newColor)
{
    Graphics g = img.getGraphics();
    g.setColor(new Color(newColor));
    Color old = new Color(oldColor);

    for(int x = 0; x < img.getWidth(); x++)
    {
        for(int y = 0; y < img.getHeight(); y++)
        {
            Color tmp = new Color(img.getRGB(x, y));
            if(tmp.equals(old));
            {
                System.out.println("Temp=" + tmp.toString() + "Old=" + old.toString() + "New=" + g.getColor().toString());
                g.fillRect(x, y, 1, 1);
            }
        }
    }
    g.dispose();
}

* oldColor的十六进制为0xFFFFFF(白色),而newColor的十六进制为0xFF0000(红色)。

使用println方法我得到了这样的结果:

    Temp=java.awt.Color[r=0,g=0,b=0]Old=java.awt.Color[r=255,g=255,b=255]New=java.awt.Color[r=255,g=0,b=0]
Temp=java.awt.Color[r=255,g=255,b=255]Old=java.awt.Color[r=255,g=255,b=255]New=java.awt.Color[r=255,g=0,b=0]

第二行看起来正确,临时颜色和旧颜色相同,但第一行显然不是这样。我也试过创建一个新的BufferedImage并复制像素,但是留下相同的结果...... equals方法不能正常工作,我认为这样做或者整个方法不起作用吗?还有更好的方法吗?谢谢你提前帮忙。

3 个答案:

答案 0 :(得分:4)

;之后删除if(tmp.equals(old)) 否则你比较颜色并在比较后什么也不做,总是选择新的颜色。

除此之外,您需要稍微重新组织代码以使其更有效:

Graphics g = img.getGraphics();
g.setColor(new Color(newColor));

for(int x = 0; x < img.getWidth(); x++) {
    for(int y = 0; y < img.getHeight(); y++) {
        if(img.getRGB(x, y) == oldColor) {//check if pixel color matches old color
            g.fillRect(x, y, 1, 1);//fill the pixel with the right color
        }
    }
}
g.dispose();



仅仅因为我对这个主题感兴趣:依靠图像过滤器你可以通过以下方式完成所有这些:

class ColorSwapFilter extends RGBImageFilter {
  int newColor, oldColor;
  public ColorSwapFilter(int newColor, int oldColor) {
    canFilterIndexColorModel = true;
    this.newColor = newColor;
    this.oldColor = oldColor;
  }

  @Override
  public int filterRGB(int x, int y, int rgb) {
    return rgb == oldColor ? newColor : oldColor;
  }
}

应该通过

调用
BufferedImage img;//your image
ColorSwapFilter filter = new ColorSwapFilter(...,...);//your colors to be swapped.
ImageProducer producer = img.getSource();
producer = new FilteredImageSource(producer, filter);
Image im = Toolkit.getDefaultToolkit().createImage(producer);

答案 1 :(得分:3)

在if语句if(tmp.equals(old));

之后,您有一个分号

这实际上告诉Java你的if语句只有一个与之关联的命令,而且该命令是一个单独的分号,实际上意味着“什么都不做”。如果你删除它,它将恢复它下面的代码块的条件,现在它正好每次都在运行,无论条件如何。

答案 2 :(得分:-1)

我得到了它的工作;这是工作的convertColors方法:

    private BufferedImage convertColors(BufferedImage img, int oldColor, int newColor)
{
    int [] pixels = new int [img.getWidth() * img.getHeight()];
    img.getRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth());
    Color old = new Color(oldColor);
    Color newC = new Color(newColor);

    for(int x = 0; x < img.getWidth(); x++)
    {
        for(int y = 0; y < img.getHeight(); y++)
        {
            Color tmp = new Color(pixels[x + y * img.getWidth()]);
            if(tmp.equals(old))
            {
                pixels[x + y * img.getWidth()] = newC.getRGB();
            }
        }
    }
    img.setRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth());

    return newImg;
}