ImageIO.read()是否保持PNG文件的透明度?

时间:2018-02-06 01:40:19

标签: java png lwjgl javax.imageio

我目前正在使用LWJGL和Java编写游戏。到目前为止,一切都进展顺利,但纹理似乎没有保持透明度。起初,我以为我在OpenGL中设置错了。但是,当我打印出使用ImageIO.read()加载的BufferedImage中的所有alpha时,所有的alpha都是255;意思是没有透明度,即使我加载的PNG文件清楚地具有透明度(我检查了Paint.NET中的透明度并确保我正确保存图像而且我是,甚至与其他人验证它以确保。)作为最后的检查,我在加载它们时手动在图像中设置所有黑色像素的alpha值,以确保我在OpenGL中的透明度正常工作并且确实如此。

有人告诉我,ImageIO.read()虽然支持PNG文件,但不支持透明度,默认为不透明的黑色或白色。这是真的?如果是这样,是否有另一种使用Java加载PNG文件的方法? (如果您希望我发布一些代码,请通过评论告诉我,我将尝试编辑答案,仅包含所需的代码。)

编辑:根据MadProgrammer的要求,这里是我遇到问题的图像之一的链接:https://i.imgur.com/4Vzriem.png有问题的图像是菜单屏幕上闪烁动画的一部分。

编辑#2:问题是当使用Color构造函数时,第四个参数(在红色,绿色,蓝色和alpha之后)必须指定true才能保留透明度/ alpha 。否则,Java将为上帝知道丢弃给定alpha的原因,而只是使用1.0F。

1 个答案:

答案 0 :(得分:2)

所以,简短的回答是,是的,ImageIO支持最常见的PNG格式的PNG透明度(我个人没有运行它不起作用,但有时候人们发布的问题表明它没有' t为图像,但他们从不张贴图像进行测试。)

所以,我带你的形象,转入一些测试代码......

import java.awt.Color;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() throws IOException {
            setBackground(Color.RED);
            add(new JLabel(new ImageIcon(ImageIO.read(new File("/Users/shanewhitehead/Downloads/4Vzriem.png")))));
        }

    }

}

启动图像编辑器并比较结果......

Comparison

因此,基于图像编辑器,PNG似乎在使用ImageIO的Java中呈现得很好。

然而,将它转换为LWJGL中的纹理可能存在问题。

例如: