我正在尝试将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/

10-13 04:35