我正在尝试将BufferedImage
中的所有黑色像素都设置为某种颜色,但是无论我输入哪种颜色,它始终只会将其设置为白色。但是,如果color
变量为黑色,则它将将其设置为黑色。
BufferedImage spritesheet =
ImageIO.read(Text.class.getResourceAsStream("/HUD/font.gif"));
for(int xx = 0; xx < spritesheet.getWidth(); xx++) {
color = new Color(200, 180, 110);
for(int yy = 0; yy < spritesheet.getHeight(); yy++) {
if(spritesheet.getRGB(xx, yy) == new Color(0, 0, 0).getRGB())
spritesheet.setRGB(xx, yy, color.getRGB());
}
}
我做错了什么?
最佳答案
吉姆·加里森(Jim Garrison)是对的。加载GIF时,其托盘中的颜色有限(黑白)。当您将像素设置为非黑色时,它将使用调色板中最接近的颜色并将其设置为白色。避免这种情况的一种方法是停止重复使用与读取时相同的BufferedImage进行写入,并创建一个全新的BufferedImage保存,如下所示:
public static void main(String[] args) throws IOException
{
BufferedImage spritesheet =
ImageIO.read(new FileInputStream("/tmp/GYBOD.gif"));
BufferedImage copy = new BufferedImage(spritesheet.getWidth(), spritesheet.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
for(int xx = 0; xx < spritesheet.getWidth(); xx++) {
Color color = new Color(200, 180, 110);
for(int yy = 0; yy < spritesheet.getHeight(); yy++) {
if(spritesheet.getRGB(xx, yy) == new Color(0, 0, 0).getRGB()) {
//spritesheet.setRGB(xx, yy, color.getRGB());
copy.setRGB(xx, yy, color.getRGB());
}
else {
copy.setRGB(xx, yy, spritesheet.getRGB(xx,yy));
}
}
}
ImageWriter writer = ImageIO.getImageWritersBySuffix("gif").next();
writer.setOutput(ImageIO.createImageOutputStream(new FileOutputStream("/tmp/test.gif")));
writer.write(copy);
}
}
然后,当您保存GIF时,Java ImageIO框架将查看BufferedImage并使用您的新颜色创建一个更广泛的托盘。
关于java - setRGB()将像素设置为白色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22265113/