【问题标题】:Transparent PNG - BufferedImage contains not existing pixels - java透明PNG - BufferedImage 包含不存在的像素 - java
【发布时间】:2021-07-12 18:30:08
【问题描述】:

我有 BufferedImage 和方法 getRGB(...) 显示我在 1959 年位置 456 的像素,但我在任何图像编辑器中都看不到这个位置的任何颜色。 我有两张透明的图像。 ImageOne 是在我的 java 应用程序中创建的。 ImageTwo 是 ImageOne(ImageOne 在 Affinity Photo 中打开并保存为 ImageTwo,没有任何更改)。

如果我在任何图像编辑器中打开 ImageOne 或 ImageTwo,我可以看到两个相同的图像。 要下载的图片:ImageOne + ImageTwoHEREHERE

但在 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 中看到它吗?为什么图像编辑器的像素“不可见”? 谢谢。

【问题讨论】:

  • 您的代码有一个(非常容易理解的)缺陷,因为您使用带有单个 int 参数的 Color 构造函数。此构造函数丢弃 alpha 分量(“创建不透明的 sRGB 颜色...Alpha 默认为 255”)。确实是一个非常令人困惑的 API。因此,您 打印像素的实际 alpha 值。更改为new Color(imageOne.getRGB(456, 1959), true) 以获得正确的值。最有可能的是,像素是透明的,即使@Hiran 的答案中给出的解释不正确。 ????

标签: java png transparency bufferedimage


【解决方案1】:

我认为这是完全合法的。 Alpha 通道为 255,这意味着墨水是完全透明的。

根据https://www.w3.org/TR/PNG-DataRep.html#DR.Alpha-channel,这个假设是错误的: alpha 值为零表示完全透明,值 (2^bitdepth)-1 表示完全不透明像素。

这意味着我无法解释为什么在图形程序中图片应该看起来一样 - 这是最初描述的症状。

【讨论】:

  • “你的 alpha 通道是 255,这意味着墨水是完全透明的。” 实际上,它是相反的。 255 或 0xFF 表示完全不透明。 0 是透明的。
猜你喜欢
  • 2014-03-30
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2012-11-14
  • 1970-01-01
相关资源
最近更新 更多