java - 透明PNG - BufferedImage 包含不存在的像素 - java
问题描述
我有 BufferedImage 和方法 getRGB(...) 显示我在 1959 年 456 位的像素,但我在任何图像编辑器中都看不到这个位置的任何颜色。我有两张透明的图像。ImageOne 是在我的 java 应用程序中创建的。ImageTwo 是 ImageOne(ImageOne 在 Affinity Photo 中打开并保存为 ImageTwo,没有任何更改)。
如果我在任何图像编辑器中打开 ImageOne 或 ImageTwo,我可以看到两个相同的图像。要下载的图像:ImageOne + ImageTwo或HERE或HERE
但在 java 应用程序中,图像似乎是不同的。此代码打印像素 456、1959 的 RGB 颜色
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表示完全不透明的像素。
这意味着我没有解释为什么在图形程序中图片应该看起来一样 - 这是最初描述的症状。
推荐阅读
- linux - 输出一个文本文件,包括用于生成它的命令
- javascript - 如何加载每分钟将url存储在数组中的新网站
- php - 合并数组值中 ID 上的多暗淡数组
- php - 使用 php 对 mysql 运行持续查询而不刷新 HTML 页面
- json - 如何读取 json 对象中所有键的值并将其添加到状态?
- visual-c++ - 如何使用 MSVC2017 构建 Xapian 1.4.10?
- postgresql - 更新触发器后的 Postgres 不反映列值,直到触发器完成
- ssas - ssas表格模型多个事实
- plot - Mathematica 11.3 输出 pdf 绘图的字体粗细
- php - 运行 composer install 命令时出错