簡體   English   中英

ImageIO.read(png)失去透明度

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM