透明 PNG - BufferedImage 不包含现有像素 - java
Transparent PNG - BufferedImage contains not existing pixels - java
我有 BufferedImage 和方法 getRGB(...) 向我显示位置 456, 1959 的像素,但我在任何图像编辑器中都看不到该位置的任何颜色。
我有两张透明的图片。 ImageOne 是在我的 java 应用程序中创建的。 ImageTwo 是 ImageOne(ImageOne 在 Affinity Photo 中打开并保存为 ImageTwo,没有任何变化)。
如果我在任何图像编辑器中打开 ImageOne 或 ImageTwo,我会看到两张相同的图像。
要下载的图片:ImageOne + ImageTwo or HERE or HERE
但在 java 应用程序中,图像似乎有所不同。此代码打印像素 456 的 RGB 颜色,1959
private static void testImage() {
try {
File fOne = new File("d:\test\ImageOne.png");
File fTwo = new File("d:\test\ImageTwo.png");
BufferedImage imageOne = ImageIO.read(fOne);
BufferedImage imageTwo = ImageIO.read(fTwo);
Color cOne = new Color(imageOne.getRGB(456, 1959));
System.out.println("imageOne = " + cOne.getRGB() + " RGBA = " + cOne.getRed() + "," + cOne.getGreen() + "," + cOne.getBlue() + "," + cOne.getAlpha());
Color cTwo = new Color(imageTwo.getRGB(456, 1959));
System.out.println("imageTwo = " + cTwo.getRGB() + " RGBA = " + cTwo.getRed() + "," + cTwo.getGreen() + "," + cTwo.getBlue() + "," + cTwo.getAlpha());
} catch (IOException e) {
e.printStackTrace();
}
}
结果是:
imageOne = -8355712 RGBA = 128,128,128,255
imageTwo = -16777216 RGBA = 0,0,0,255
是否可以从这些“不可见”像素中清除 BufferedImage?
您是否知道为什么 ImageOne 中有像素以及为什么我只能在 java 中看到它?为什么图像编辑器的像素“不可见”?
谢谢。
我认为这是完全合法的。 Alpha 通道为 255,这意味着墨水是完全透明的。
根据 https://www.w3.org/TR/PNG-DataRep.html#DR.Alpha-channel,这个假设是错误的:
alpha 值为零表示完全透明,值 (2^bitdepth)-1 表示完全不透明的像素。
这意味着我无法解释为什么在图形程序中图片应该看起来相同 - 这就是最初描述的症状。
我有 BufferedImage 和方法 getRGB(...) 向我显示位置 456, 1959 的像素,但我在任何图像编辑器中都看不到该位置的任何颜色。 我有两张透明的图片。 ImageOne 是在我的 java 应用程序中创建的。 ImageTwo 是 ImageOne(ImageOne 在 Affinity Photo 中打开并保存为 ImageTwo,没有任何变化)。
如果我在任何图像编辑器中打开 ImageOne 或 ImageTwo,我会看到两张相同的图像。 要下载的图片:ImageOne + ImageTwo or HERE or HERE
但在 java 应用程序中,图像似乎有所不同。此代码打印像素 456 的 RGB 颜色,1959
private static void testImage() {
try {
File fOne = new File("d:\test\ImageOne.png");
File fTwo = new File("d:\test\ImageTwo.png");
BufferedImage imageOne = ImageIO.read(fOne);
BufferedImage imageTwo = ImageIO.read(fTwo);
Color cOne = new Color(imageOne.getRGB(456, 1959));
System.out.println("imageOne = " + cOne.getRGB() + " RGBA = " + cOne.getRed() + "," + cOne.getGreen() + "," + cOne.getBlue() + "," + cOne.getAlpha());
Color cTwo = new Color(imageTwo.getRGB(456, 1959));
System.out.println("imageTwo = " + cTwo.getRGB() + " RGBA = " + cTwo.getRed() + "," + cTwo.getGreen() + "," + cTwo.getBlue() + "," + cTwo.getAlpha());
} catch (IOException e) {
e.printStackTrace();
}
}
结果是:
imageOne = -8355712 RGBA = 128,128,128,255
imageTwo = -16777216 RGBA = 0,0,0,255
是否可以从这些“不可见”像素中清除 BufferedImage? 您是否知道为什么 ImageOne 中有像素以及为什么我只能在 java 中看到它?为什么图像编辑器的像素“不可见”? 谢谢。
我认为这是完全合法的。 Alpha 通道为 255,这意味着墨水是完全透明的。
根据 https://www.w3.org/TR/PNG-DataRep.html#DR.Alpha-channel,这个假设是错误的: alpha 值为零表示完全透明,值 (2^bitdepth)-1 表示完全不透明的像素。
这意味着我无法解释为什么在图形程序中图片应该看起来相同 - 这就是最初描述的症状。