有关完整的项目检查存储库,请点击此处。随时克隆并运行。注意测试图像 https://github.com/AshGale/Image2RGBA
当在GIMP中读取具有显示为空(哈希)部分的PNG时,读入程序的值为[0,0,0,255](红色,绿色,蓝色,Alpha)。我期望空位具有Alpha 0,因此完全为空[0,0,0,0]。但是,值是[0,0,0,255]也是全黑的。
问题,如何在java中检查像素是否完全为空,即在gimp中散列。
然后我如何将其写入带有bufferedImage的图像文件中。
对于图像为空的图像,alpha值应该为0吗?请建议以文件或文件格式读取的方式。
//代码提取有关完整代码,请参见Git
...
for (int i = 0; i < imageHeight; i++) {
for (int j = 0; j < imageWidth; j++) {
individualPixel = new Color(buffImage.getRGB(j, i));
//TODO find a way to detect a empty pixel an keep perfect black
if(individualPixel.getRed() == 0
&& individualPixel.getGreen() == 0
&& individualPixel.getBlue() ==0
) {
//set pixel at location to empty
buffRed.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
buffGreen.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
buffBlue.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
}else {
// RED
tempPixel = new Color(individualPixel.getRed(), 0, 0, individualPixel.getAlpha());
buffRed.setRGB(j, i, getIntFromColor(tempPixel.getRed(), 0, 0, tempPixel.getAlpha()));
// GREEN
// BLUE
}
...
ImageIO.write(buffRed, "png", redImg);
答案 0 :(得分:1)
我相信您原始代码中的问题仅是这一行:
individualPixel = new Color(buffImage.getRGB(j, i));
此Color
构造函数有效地丢弃了alpha分量。 JavaDoc说(重点是我):
使用指定的组合RGB值创建不透明 sRGB颜色[...] Alpha默认为255。
应该是:
individualPixel = new Color(buffImage.getRGB(j, i), true); // hasAlpha = true
此构造函数JavaDoc说:
使用指定的RGBA组合值创建一个sRGB颜色[...]如果
hasalpha
参数为false
,则alpha默认为255。
您不必真正使用alpha栅格(并非所有BufferedImage
都具有一个栅格)来实现此目的,并且避免它既简单又兼容。
最后,完全透明像素的R,G和B值并不重要。因此,测试是否全黑可能是一个过于严格的检查(尽管对于您的输入图像来说似乎确实可以正常工作)。
PS:我认为更精确的术语是“透明”,而不是“空”。
答案 1 :(得分:0)
这是可行的示例,您也可以在有问题的github上查看完整的示例。 感谢托马斯(Thomas)反对使用getAlphaRaster()
// get RGB from image
BufferedImage buffImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
try {
buffImage = ImageIO.read(imageFile);
} catch (IOException e) {
}
int imageHeight = buffImage.getHeight();
int imageWidth = buffImage.getWidth();
Color individualPixel = null;
Color tempPixel = null;
BufferedImage buffRed = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
BufferedImage buffGreen = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
BufferedImage buffBlue = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
WritableRaster imageRaster = buffImage.getAlphaRaster();
int[] pixel = new int[4];
int alpha = 0;
for (int i = 0; i < imageHeight; i++) {
for (int j = 0; j < imageWidth; j++) {
individualPixel = new Color(buffImage.getRGB(j, i));
imageRaster.getPixel(j, i, pixel);
alpha = pixel[0];//return 0 for empty
//if(individualPixel.getAlpha() <255 || alpha >0)
System.out.println(j + "," + i + " : " + individualPixel.getAlpha()+ "-"+alpha+ " =>" +
pixel[0] + " " + pixel[1] + " " + pixel[2] + " " + pixel[3]);
//TODO find a way to detect a empty pixel an keep perfect black
if(individualPixel.getRed() == 0
&& individualPixel.getGreen() == 0
&& individualPixel.getBlue() ==0
& alpha == 0) {
//set pixel at location to empty
buffRed.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
buffGreen.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
buffBlue.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
}else {
// RED
tempPixel = new Color(individualPixel.getRed(), 0, 0, individualPixel.getAlpha());
buffRed.setRGB(j, i, getIntFromColor(tempPixel.getRed(), 0, 0, tempPixel.getAlpha()));
// GREEN
tempPixel = new Color(0, individualPixel.getGreen(), 0, individualPixel.getAlpha());
buffGreen.setRGB(j, i, getIntFromColor(0, tempPixel.getGreen(), 0, tempPixel.getAlpha()));
// BLUE
tempPixel = new Color(0, 0, individualPixel.getBlue(), individualPixel.getAlpha());
buffBlue.setRGB(j, i, getIntFromColor(0, 0, tempPixel.getBlue(), tempPixel.getAlpha()));
}
}
System.out.println("");
}
// Save Images to path of selected file
try {
ImageIO.write(buffRed, "png", redImg);
ImageIO.write(buffGreen, "png", greenImg);
ImageIO.write(buffBlue, "png", blueImg);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Failed to create RGB files");
e.printStackTrace();
}