[英]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文件的方法吗? (如果您希望我发布一些代码,请通过评论让我知道,我将尝试编辑答案以仅包括所需的代码。)
编辑:根据MadProgrammer的请求,这是指向我遇到问题的图像之一的链接: https ://i.imgur.com/4Vzriem.png有问题的图像是菜单屏幕上闪烁的动画的一部分。
编辑#2:问题是,当使用Color构造函数时,第四个参数(在红色,绿色,蓝色和alpha之后)必须指定true
才能保留透明度/ alpha。 否则,对于上帝而言,Java会知道是什么原因丢弃了给定的alpha,而是仅使用1.0F。
因此,简短的答案是,是的, ImageIO
支持大多数常见的PNG格式的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")))));
}
}
}
启动图像编辑器并比较结果...
因此,基于图像编辑器,似乎可以使用ImageIO
在Java中很好地渲染PNG。
但是,在LWJGL中将其转换为纹理可能会出现问题。
例如:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.