簡體   English   中英

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文件的方法嗎? (如果您希望我發布一些代碼,請通過評論讓我知道,我將嘗試編輯答案以僅包括所需的代碼。)

編輯:根據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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM