在Java中更改png的非透明部分的颜色

我试图自动更改一组图标的颜色。 每个图标都有一个白色填充图层,另一个图标是透明的。 这是一个例子:(在这种情况下它是绿色的,只是为了让它可见)

图标搜索

我试着做以下事情:

private static BufferedImage colorImage(BufferedImage image) { int width = image.getWidth(); int height = image.getHeight(); for (int xx = 0; xx < width; xx++) { for (int yy = 0; yy < height; yy++) { Color originalColor = new Color(image.getRGB(xx, yy)); System.out.println(xx + "|" + yy + " color: " + originalColor.toString() + "alpha: " + originalColor.getAlpha()); if (originalColor.equals(Color.WHITE) && originalColor.getAlpha() == 255) { image.setRGB(xx, yy, Color.BLUE.getRGB()); } } } return image; } 

我遇到的问题是我得到的每个像素都具有相同的值:

 32|18 color: java.awt.Color[r=255,g=255,b=255]alpha: 255 

所以我的结果只是一个彩色方块。 如何才能实现仅更改非透明部件的颜色? 为什么所有像素都具有相同的alpha值? 我想这是我的主要问题:没有正确读取alpha值。

为什么它不起作用,我不知道,这会。

这会将所有像素变为蓝色,保持其alpha值…

在此处输入图像描述

 import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class TestColorReplace { public static void main(String[] args) { try { BufferedImage img = colorImage(ImageIO.read(new File("NWvnS.png"))); ImageIO.write(img, "png", new File("Test.png")); } catch (IOException ex) { ex.printStackTrace(); } } private static BufferedImage colorImage(BufferedImage image) { int width = image.getWidth(); int height = image.getHeight(); WritableRaster raster = image.getRaster(); for (int xx = 0; xx < width; xx++) { for (int yy = 0; yy < height; yy++) { int[] pixels = raster.getPixel(xx, yy, (int[]) null); pixels[0] = 0; pixels[1] = 0; pixels[2] = 255; raster.setPixel(xx, yy, pixels); } } return image; } } 

问题是,那

 Color originalColor = new Color(image.getRGB(xx, yy)); 

丢弃所有的alpha值。 相反,你必须使用

  Color originalColor = new Color(image.getRGB(xx, yy), true); 

保持alpha值可用。