我正在尝试为我的游戏编写一个方法,该方法将采用图像,旧颜色的十六进制值和新颜色的十六进制值,然后将旧颜色的所有像素转换为新颜色。现在,该方法将整个图像绘制为新颜色,就像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方法不能正常工作,我认为这样做或者整个方法不起作用吗?还有更好的方法吗?谢谢你提前帮忙。
答案 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;
}