当前位置: 首页 > 知识库问答 >
问题:

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

阮疏珂
2023-03-14

我目前正在用LWJGL和Java编程一个游戏。到目前为止,一切都进展顺利,但纹理似乎无法保持其透明度。起初,我以为我在OpenGL中设置了一些错误。然而,当我从使用ImageIO加载的BuffereImage打印出所有字母时。read(),所有字母都是255;这意味着即使我加载的PNG文件中明显有透明度,也没有透明度(我在Paint.NET中检查了透明度,确保我正确保存了图像,并与其他人进行了验证以确保其透明性。)作为最后一项检查,我在加载图像时手动设置了图像中所有黑色像素的alpha,以确保我在OpenGL中的透明度正常工作。

有人告诉我ImageIO. read()虽然支持PNG文件,但不支持其中的透明度,并且默认为不透明的黑色或白色。这是真的吗?如果是,是否有其他方法使用Java加载PNG文件?(如果您希望我发布一些html" target="_blank">代码,请通过评论告诉我,我会尝试编辑答案以仅包含所需的代码。)

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

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

共有1个答案

陆俭
2023-03-14

因此,简短的回答是,是的,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")))));
        }

    }

}

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

因此,基于图像编辑器,在Java中使用ImageIO可以很好地呈现PNG。

然而,在LWJGL中将它转换为纹理可能会出现问题。

例如:

  • LWJGL png纹理透明度(TextureColor.白色而非黑色)
  • 如何在LWJGL中绘制透明纹理
 类似资料:
  • 我正试图重新设计我的网站,使我原来的方形、基于瓷砖的图像渲染更像是图像的剪贴画。。。为了摆脱网格模式。 这是它最初的样子。。。 这是我想要的一个粗略的模型: 所以我重新保存了一个透明背景的图像缩略图。。。我只想让狗展示,正方形是透明的,可以在下面显示网站的背景。 然而,当我在页面上呈现它时,它的背景是黑色的。 我已经检查了我的CSS,看看是否有某种img类,或用于渲染漫画的类。。。甚至可以通过引导

  • 问题内容: 嘿,当我从png创建缩略图时,尝试保持png的透明度时遇到麻烦,有人对此有任何经验吗?任何帮助都会很棒,这是我目前正在做的事情: 问题答案: 过去,我已经成功地做到了: 我发现输出图像使用质量更好的比

  • 我有一个包含透明图标(32位,带alpha通道)的。我想做的是将基于图像索引的单个图标保存为PNG文件,同时保留alpha通道的透明度。使用RAD Studio 2010,因此它具有支持,不需要第三方库。图像从PNG“精灵”图像中加载到TImageList中,使用这里的方法——在运行时使用Delphi XE将png图像添加到图像列表中——因此加载时保留透明度。现在我需要单独保存它们,换句话说,从已

  • 问题内容: 我正在使用以下代码读取PNG图片: 在显示时,有一个黑色背景,我知道是由PNG透明性引起的。 我找到了建议使用的解决方案,但是我不确定如何将其应用于上面的代码。 问题答案: 创建第二个类型… 将原件涂到副本上… 您现在有了图像的非透明版本… 要保存图像,请看写/保存图像

  • 我试图将png文件复制到程序中的剪贴板,并在粘贴到另一个程序(例如ms office、paint、photoshop)时保持其alpha通道。问题是,在大多数节目中,alpha频道都会变成黑色。我已经在网上搜索了好几个小时,找不到解决办法。我使用的代码是: 有没有办法在Java中维护alpha通道?我尝试过将png转换为BuffereImage、Image等,并将其粘贴到剪贴板,但没有任何效果。