有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ImageIO。阅读(png)失去透明度

我在使用(1)时测试了我的图像,它的类型是_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);

}

这是我的形象

提前谢谢

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

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


共 (1) 个答案

  1. # 1 楼答案

    您的图像文件是一个24位RGB PNG文件,带有可选的tRNS块,指定一种应被视为透明的RGB颜色(与具有完整alpha通道的32位RGBA PNG相反)

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

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

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

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