2011-01-10 16 views
5

Parece que PNG cargado con ImageIO.read ignora el canal alfa. (He intentado con JRE 6 actualización 20)ImageIO ignora el canal alfa PNG

Error?

Ejemplo:

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

¿Qué le parece publicar una aplicación de reducción que demuestre este comportamiento? –

+0

Posiblemente relacionado con [imágenes Java con canal alfa sin usar imagen almacenada en el búfer] (http://stackoverflow.com/q/2273730/448455). –

+0

ejemplo de código agregado – Arutha

Respuesta

5

¿Cómo sabes que ignora el canal alfa? El código siguiente produce captura de pantalla:

enter image description here

Código:

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

través de mi experiencia - probado con JDK 1.6.0_21, Java ImageIO png decodificador compatible con la transparencia parcial. Admite una imagen a todo color de 24 bits con un canal alfa adicional (totalmente de 32 bits por píxel), así como una imagen de color indexada con tronco tRNS que incluye un mapa alfabético que se puede combinar con la paleta de colores RGB existente para definir qué color es transparente Pero NO es compatible con RGB de 24 bits con un tronco tRNS que incluye un único valor de color RGB transparente para la imagen. Tal vez su imagen es uno de esos formatos que no son compatibles con imageio.

Cuestiones relacionadas