[英]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.