2011-01-10 15 views
5

ImageIO.read ile yüklenen PNG'nin alfa kanalını görmezden geldiği anlaşılıyor. (JRE 6 güncelleştirmesi 20 ile çalıştım)ImageIO, PNG alfa kanalı yoksayıyor

Hata?

Örnek:

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

Bu davranışı gösteren bir aşağıdan yükleme uygulaması yayınlamaya ne dersiniz? –

+0

Muhtemelen [buffered resmini kullanmadan alfa kanalı ile java görüntüleri] ile ilgili olabilir (http://stackoverflow.com/q/2273730/448455). –

+0

kod örneği eklendi – Arutha

cevap

5

Alfa kanalını yok saydığını nereden biliyorsunuz?

enter image description here

Kod: Aşağıdaki kod bu ekran görüntüsünü üretir

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

benim deneyim sayesinde - JDK 1.6.0_21, Java ImageIO png dekoder ile test kısmen şeffaflığı destekler. Ek bir alfa kanalı (piksel başına toplam 32 bit) ile 24 bit tam renkli görüntüyü ve hangi rengin tanımlanması için mevcut RGB renk paleti ile birleştirilebilen bir alfa haritasının bulunduğu tRNS trunk ile indekslenmiş renkli görüntüyü destekler şeffaftır. Ancak, görüntü için tek bir saydam RGB renk değeri içeren bir tRNS trunk ile 24 bit RGB'yi desteklemiyor. Belki de görüntünüz, imageio tarafından desteklenmeyen formatlardan biridir.

İlgili konular