ImageIO игнорирует альфа-канал PNG - PullRequest
5 голосов
/ 10 января 2011

Кажется, что PNG, загруженный с ImageIO.read, игнорирует альфа-канал.(Я пробовал с обновлением JRE 6 20)

Ошибка?

Пример:

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();
}

}

Ответы [ 3 ]

5 голосов
/ 11 января 2011

Откуда вы знаете, что он игнорирует альфа-канал.Приведенный ниже код создает этот снимок экрана:

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 голосов
/ 16 марта 2012

Благодаря моему опыту, протестированному с JDK 1.6.0_21, Java imageio png декодер частично поддерживает прозрачность.Он поддерживает 24-битное полноцветное изображение с дополнительным альфа-каналом (всего 32 бита на пиксель), а также индексированное цветное изображение со стволом tRNS, которое включает в себя альфа-карту, которую можно комбинировать с существующей цветовой палитрой RGB, чтобы определить, какой цветпрозрачныйНо он НЕ поддерживает 24-битный RGB с транком tRNS, который включает в себя одно прозрачное значение цвета RGB для изображения.Возможно, ваше изображение является одним из таких форматов, которые не поддерживаются imageio.

1 голос
/ 10 января 2011

Вы можете использовать Sixlegs Java PNG Decoder , в нем нет ошибки альфа-прозрачности. Для справки: Sun Java Bug # 6371389 говорит о похожей проблеме с альфа-каналами PNG.

...