2011-01-10 8 views
5

Es scheint, dass PNG geladen mit ImageIO.read den Alphakanal ignorieren. (Ich versuchte mit JRE 6 Update 20)ImageIO ignoriert PNG-Alpha-Kanal

Bug?

Beispiel:

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

Wie wäre es mit dem Posten einer Cut-Down-Anwendung, die dieses Verhalten demonstriert? –

+0

Möglicherweise verwandt mit [Java-Bildern mit Alphakanal ohne gepuffertes Bild] (http://stackoverflow.com/q/2273730/448455). –

+0

Codebeispiel hinzugefügt – Arutha

Antwort

5

Woher wissen Sie, dass es den Alpha-Kanal ignoriert. Der folgende Code erzeugt diesen Screenshot:

enter image description here

Code:

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

Durch meine Erfahrung - getestet mit JDK 1.6.0_21, Java ImageIO png Decoder unterstützt teilweise Transparenz. Es unterstützt 24-Bit-Vollfarbbilder mit einem zusätzlichen Alphakanal (insgesamt 32 Bit pro Pixel) sowie indizierte Farbbild mit tRNS-Stamm, der eine Alpha-Map enthält, die mit der bestehenden RGB-Farbpalette kombiniert werden kann, um die Farbe zu definieren ist transparent. Es unterstützt jedoch NICHT 24-Bit-RGB mit einer tRNS-Leitung, die einen einzelnen transparenten RGB-Farbwert für das Bild enthält. Vielleicht ist Ihr Bild eines dieser Formate, die von imageio nicht unterstützt werden.