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

标签 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。

最佳答案

所以,简短的回答是,是的,ImageIO 支持大多数常见 PNG 格式的 PNG 透明度(我个人没有运行过它,但它不起作用,但偶尔有人会提出问题,指出它不适用于图像,但他们从不发布图像进行测试)。

所以,我把你的图像转储到一些测试代码中......

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

因此,基于图像编辑器,使用 ImageIO 在 Java 中渲染 PNG 似乎效果很好。

但是,将其转换为 LWJGL 中的纹理时可能会出现问题。

例如:

关于java - ImageIO.read() 是否保持 PNG 文件的透明度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48634207/

相关文章:

c++ - 使用 C++ 从 *.fla 导出 *.png 序列

java - 将 Java 2d 图形图像保存为 .png 文件

java - 回调到类(非实例)

java - 不同的分辨率是否需要多个 VBO/DL?

java - 使用另一个 Map 中的值按键对 Map 进行排序

java - 如何使用 JSTL 迭代多个 ArrayList?

php - 如何在 PHP 中通过 Imagick 将 PNG32 转换为 PNG8

java - LWJGL Circle 程序创建椭圆形形状

java - 用于基于流程的编程的 Pentaho Kettle

java - 如何在 Hippo CMS 模板中检查是否为空并显示富文本字段 (HTML)