アイコンのセットの色を自動的に変更しようとしています。すべてのアイコンには白で塗りつぶされたレイヤーがあり、他の部分は透明です。次に例を示します:(この場合は、表示するためだけに緑色です)
私は次のことをしようとしました:
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
だから私の結果はただの色付きの正方形です。不透明部分のみの色を変更するにはどうすればよいですか?そして、なぜ、すべてのピクセルが同じアルファ値を持っているのですか?それが私の主な問題だと思います。アルファ値が正しく読み取られないことです。
問題はそれです
Color originalColor = new Color(image.getRGB(xx, yy));
すべてのアルファ値を破棄します。代わりに使用する必要があります
Color originalColor = new Color(image.getRGB(xx, yy), true);
アルファ値を利用できるようにします。
なぜそれが機能しないのか、私にはわかりません、これは機能します。
これにより、すべてのピクセルが青に変わり、アルファ値が維持されます...
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;
}
}