ImageIO 忽略 PNG Alpha 通道

发布于 2024-10-11 09:17:36 字数 719 浏览 3 评论 0原文

似乎用 ImageIO.read 加载的 PNG 忽略了 alpha 通道。 (我尝试使用 JRE 6 update 20)

Bug ?

例子 :

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

}

It seems that PNG loaded with ImageIO.read ignore the alpha channel.
(I tried with JRE 6 update 20)

Bug ?

Example :

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

橘味果▽酱 2024-10-18 09:17:36

你怎么知道它忽略了 Alpha 通道。下面的代码生成此屏幕截图:

在此处输入图像描述

代码:

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

How do you know that it ignores the alpha channel. The code below produces this 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);
}
空城仅有旧梦在 2024-10-18 09:17:36

根据我的经验 - 使用 JDK 1.6.0_21 进行测试,Java imageio png 解码器部分支持透明度。它支持带有附加 Alpha 通道的 24 位全彩色图像(每像素总共 32 位),以及带有 tRNS 主干的索引彩色图像,其中包含可与现有 RGB 调色板结合使用的 Alpha 贴图来定义哪种颜色是透明的。但它不支持 24 位 RGB 以及包含图像的单个透明 RGB 颜色值的 tRNS 主干。也许您的图像是 imageio 不支持的格式之一。

Through my experience - tested with JDK 1.6.0_21, Java imageio png decoder supports transparency partially. It supports 24-bit full color image with an additional alpha channel (totally 32-bit per pixel), as well as indexed color image with tRNS trunk which includes an alpha map that can be combined with the existing RGB color palette to define which color is transparent. But it DOES NOT support 24-bit RGB with a tRNS trunk that includes a single transparent RGB color value for the image. Perhaps your image is one of such formats that are not supported by imageio.

酷遇一生 2024-10-18 09:17:36

您可以使用 Sixlegs Java PNG Decoder ,它没有 alpha 透明度错误。作为参考,Sun Java Bug #6371389 讨论了 PNG alpha 的类似问题渠道。

You can use Sixlegs Java PNG Decoder , it doesn't have alpha transparency bug. For reference, Sun Java Bug #6371389 talks about a similar issue with PNG alpha channels.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文