2011-01-10 12 views
5

ImageIO.readがロードされたPNGがアルファチャンネルを無視しているようです。 (私はJRE 6アップデート20で試しました)ImageIOがPNGアルファチャンネルを無視します

バグ?

例:

public class Test extends JFrame 
{ 

public Test() 
{ 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JButton b = new JButton("Test"); 
    try 
    { 
     b.setIcon(new ImageIcon(ImageIO.read(new File("D:\\image.png")))); 
    } 
    catch (IOException e2) 
    { 
    } 
    b.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     } 
    }); 
    getContentPane().add(b, BorderLayout.CENTER); 
    setSize(500,500); 
    setVisible(true); 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    new Test(); 
} 

}

+1

この動作を示すカットダウンアプリケーションの投稿はどうですか? –

+0

[バッファされた画像を使用しないアルファチャンネルのJava画像](http://stackoverflow.com/q/2273730/448455)と関連している可能性があります。 –

+0

コード例が追加されました – Arutha

答えて

1

あなたは​​を使用することができ、それはアルファ透明度のバグを持っていません。参考までに、Sun Java Bug #6371389はPNGアルファチャンネルに関する同様の問題について話しています。

5

アルファチャンネルを無視することをどのように知っていますか。以下のコードは、このスクリーンショットを生成します。

enter image description here

コード:私の経験を通して

public static void main(String[] args) throws Exception { 

    URL url = new URL("http://upload.wikimedia.org/" + 
        "wikipedia/commons/4/47/PNG_transparency_demonstration_1.png"); 
    Image image = ImageIO.read(url); 

    JPanel bgPanel = new JPanel(new BorderLayout()) {{ 
      setOpaque(false); 
     } 
     protected void paintComponent(Graphics g) { 
      Rectangle r = g.getClipBounds(); 
      // paint bg 
      int s = 10; 
      for (int y = r.y/s; y < r.y + r.height; y += s) { 
       int o = (y % (2*s) == 0 ? s : 0); 
       for (int x = r.x/s + o; x < r.x + r.width; x += 2*s) 
        g.fillRect(x, y, s, s); 
      } 
      super.paintComponent(g); 
     } 
    }; 

    bgPanel.add(new JLabel(new ImageIcon(image)) {{ 
     setOpaque(false); 
    }}); 

    JFrame frame = new JFrame("Test"); 
    frame.add(bgPanel); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(350, 300); 
    frame.setVisible(true); 
} 
2

- JDK 1.6.0_21でテストし、JavaのImageIOにPNGデコーダは、部分的に透明度をサポートしています。追加のアルファチャンネル(1ピクセルあたり32ビット)と、既存のRGBカラーパレットと組み合わせてどの色を定義できるアルファマップを含むtRNSトランク付きのインデックス付きカラー画像を備えた24ビットフルカラー画像をサポートしています透明です。しかし、イメージ用に1つのトランスペアレントRGBカラー値を含むtRNSトランクを備えた24ビットRGBはサポートしていません。おそらくあなたのイメージはimageioでサポートされていないフォーマットの1つです。

関連する問題