[英]ImageIO.read(png) losing its transparency
我在使用(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);
}
这是我的形象。
提前致谢!
PS:Btw网站必须坏掉我无法粘贴我的代码,不得不重写它,很奇怪。
PS2:这也是我第二次打招呼! 当第一行被删除...
您的图片文件是一个24位RGB PNG文件,带有一个可选的tRNS
块,指定了一种应视为透明的RGB颜色(与具有完整alpha通道的32位RGBA PNG相对)。
出于某种原因,该标准PNGImageReader
自带的JRE 不会创建一个RGB的PNG透明图像tRNS
块。 根据规范,可选块(以小写字母开头)可以被解码器忽略,因此这是完全可以接受的行为。
但是,您可以使用ImageIO API读取PNG的元数据,如果有tRNS
块,则可以创建一个透明的BufferedImage
并自己应用该透明性(替换所有与tRNS
块中的RGB值相等的RGB值)。 但是,如果您只想阅读与应用程序捆绑在一起的图标,则这是很多额外的工作。
最简单的解决方法是仅存储具有调色板和透明度的PNG或完整的32位RGBA PNG,ImageIO支持这两种格式,而无需进行任何其他工作。
它使用“直接” ImageIcon
方法工作的原因是, ImageIcon
使用的是与ImageIO完全不同的PNG解码器,它似乎确实应用了tRNS
块(在您的情况下,但我认为不是必须这样做,因此行为可能因JRE或平台而异,您必须进行测试)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.