ImageIO.read() 是否保持 PNG 文件的透明度?
Does ImageIO.read() keep transparency from PNG files?
我目前正在使用 LWJGL 和 Java 编写游戏。到目前为止,一切进展顺利,但纹理似乎没有保持其透明度。起初,我以为我在 OpenGL 中设置了错误。但是,当我打印出使用 ImageIO.read() 加载的 BufferedImage 中的所有 alpha 时,所有 alpha 都是 255;这意味着即使我正在加载的 PNG 文件显然具有透明度,也没有透明度(我检查了 Paint.NET 中的透明度并确保我正确保存了图像并且我是,甚至与其他人验证它以确保它。)作为最后的检查,我在加载图像时手动设置了图像中所有黑色像素的 alpha,以确保我在 OpenGL 中的透明度正常工作。
有人告诉我 ImageIO.read() 虽然支持 PNG 文件,但不支持它们的透明度,并且默认为不透明的黑色或白色。这是真的?如果是这样,是否有另一种使用 Java 加载 PNG 文件的方法? (如果你想让我 post 一些代码,请通过评论告诉我,我会尝试编辑答案以仅包含所需的代码。)
编辑:根据 MadProgrammer 的要求,这里是 link 我遇到问题的图像之一: https://i.imgur.com/4Vzriem.png 有问题的图像是菜单屏幕上闪烁动画的一部分.
编辑 #2:问题是当使用 Color 构造函数时,第四个参数(在红色、绿色、蓝色和 alpha 之后)必须指定 true
以便 transparency/alpha 得以保存。否则,Java 天知道什么原因会丢弃给定的 alpha 而只使用 1.0F。
所以,简短的回答是,是的,ImageIO
支持大多数常见 PNG 格式的 PNG 透明度(我个人认为 运行 它不起作用,但偶尔有人 post 问题说明它不适用于图像,但他们从不 post 用于测试的图像)。
所以,我给你拍了张照片,转储到一些测试代码中......
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")))));
}
}
}
启动图像编辑器并比较结果...
因此,基于图像编辑器,PNG 似乎在 Java 中使用 ImageIO
渲染得很好。
但是在 LWJGL 中将其转换为纹理可能会出现问题。
例如:
- How to draw transparent textures in LWJGL?
我目前正在使用 LWJGL 和 Java 编写游戏。到目前为止,一切进展顺利,但纹理似乎没有保持其透明度。起初,我以为我在 OpenGL 中设置了错误。但是,当我打印出使用 ImageIO.read() 加载的 BufferedImage 中的所有 alpha 时,所有 alpha 都是 255;这意味着即使我正在加载的 PNG 文件显然具有透明度,也没有透明度(我检查了 Paint.NET 中的透明度并确保我正确保存了图像并且我是,甚至与其他人验证它以确保它。)作为最后的检查,我在加载图像时手动设置了图像中所有黑色像素的 alpha,以确保我在 OpenGL 中的透明度正常工作。
有人告诉我 ImageIO.read() 虽然支持 PNG 文件,但不支持它们的透明度,并且默认为不透明的黑色或白色。这是真的?如果是这样,是否有另一种使用 Java 加载 PNG 文件的方法? (如果你想让我 post 一些代码,请通过评论告诉我,我会尝试编辑答案以仅包含所需的代码。)
编辑:根据 MadProgrammer 的要求,这里是 link 我遇到问题的图像之一: https://i.imgur.com/4Vzriem.png 有问题的图像是菜单屏幕上闪烁动画的一部分.
编辑 #2:问题是当使用 Color 构造函数时,第四个参数(在红色、绿色、蓝色和 alpha 之后)必须指定 true
以便 transparency/alpha 得以保存。否则,Java 天知道什么原因会丢弃给定的 alpha 而只使用 1.0F。
所以,简短的回答是,是的,ImageIO
支持大多数常见 PNG 格式的 PNG 透明度(我个人认为 运行 它不起作用,但偶尔有人 post 问题说明它不适用于图像,但他们从不 post 用于测试的图像)。
所以,我给你拍了张照片,转储到一些测试代码中......
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")))));
}
}
}
启动图像编辑器并比较结果...
因此,基于图像编辑器,PNG 似乎在 Java 中使用 ImageIO
渲染得很好。
但是在 LWJGL 中将其转换为纹理可能会出现问题。
例如:
- How to draw transparent textures in LWJGL?