[英]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.