【问题标题】:ImageIO.read(png) losing its transparencyImageIO.read(png) 失去透明度
【发布时间】:2018-07-22 21:24:52
【问题描述】:

我在使用 (1) 时测试了我的图像,它是 TYPE_3BYTE_BGR 类型,而它是透明图像,当使用 (2) 时,我的图像显示为透明,有人可以解释我在哪里做错了吗?

这是我的代码:

public static void main(String[] args){

    Frame frame = new Frame();
    frame.setSize(200, 200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);
    frame.getContentPane().setBackground(Color.PINK);
    BufferedImage image;
    try{
        image = ImageIO.read(new File("my_path"));
    }catch(IOException e){
        image = null;
    }
    JLabel label = new JLabel(new ImageIcon("my_path"));
    //JLabel label = new JLabel(new ImageIcon(image));
    frame.getContentPane().add(label);
    label.setBounds(10, 10, 6, 10);
    frame.setVisible(true);

}

Here是我的头像。

提前致谢!

PS:顺便说一句,网站一定是坏了我无法粘贴我的代码,不得不重写它,很奇怪。

PS2:这也是我第二次“嗨!”随着第一行被删除...

【问题讨论】:

  • 有人需要我澄清一下吗?我真的需要这方面的帮助..
  • (1) 和 (2) 指的是什么?此外,图像具有透明度而具有 TYPE_3BYTE_BGR 类型没有任何意义,因为这种类型没有透明度...... PS:通常不鼓励使用不必要的礼貌用语,例如“嗨”或“谢谢”提前”。相反,请专注于提出一个明确的问题,并提供必要的细节。

标签: java javax.imageio


【解决方案1】:

您的图像文件是 24 位 RGB PNG 文件,带有可选的 tRNS 块,指定应视为透明的单一 RGB 颜色(相对于具有完整 Alpha 通道的 32 位 RGBA PNG)。

出于某种原因,JRE 附带的标准PNGImageReader 确实为带有tRNS 块的RGB PNG 创建透明图像。根据规范,解码器可以忽略可选块(以小写字母开头),因此这是完全可以接受的行为。

但是,您可以使用 ImageIO API 读取 PNG 的元数据,如果有 tRNS 块,您可以创建一个透明的 BufferedImage 并自己应用透明度(替换所有等于 RGB 的 RGB 值tRNS 块中的值)。但是,如果您只想阅读与您的应用程序捆绑在一起的图标,这是相当多的额外工作。

最简单的解决方法是只存储带有调色板和透明度的 PNG 或完整的 32 位 RGBA PNG,ImageIO 都支持这两种方式,无需任何工作。

它使用“直接”ImageIcon 方法工作的原因是,ImageIcon 使用与 ImageIO 完全不同的 PNG 解码器,它似乎确实应用了 tRNS 块(在你的情况下,但我不' t 认为必须,因此行为可能因 JRE 或平台而异,您必须进行测试)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-15
    • 2010-12-10
    • 1970-01-01
    • 2016-01-22
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多