2011-01-10 3 views
5

Кажется, что PNG, загруженный с ImageIO.read, игнорирует альфа-канал. (Я пробовал с JRE 6 update 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

Вы можете использовать Sixlegs Java PNG Decoder, он не имеет альфа-прозрачность ошибка. Для справки, 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 декодер поддерживает прозрачность частично. Он поддерживает 24-битное полноцветное изображение с дополнительным альфа-каналом (полностью 32-бит на пиксель), а также индексированное цветное изображение с соединительной створкой tRNS, которая включает альфа-карту, которая может быть объединена с существующей цветовой палитрой RGB, чтобы определить, какой цвет является прозрачным. Но он НЕ поддерживает 24-битный RGB с trunk tRNS, который включает в себя одно прозрачное значение цвета RGB для изображения. Возможно, ваше изображение является одним из таких форматов, которые не поддерживаются imageio.

Смежные вопросы