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 楼答案
您的图像文件是一个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或平台而异,您必须进行测试)