[英]ImageIO ignores PNG alpha channel
似乎裝有ImageIO.read的PNG忽略了alpha通道。 (我試過JRE 6更新20)
錯誤?
示例:
public class Test extends JFrame
{
public Test()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton b = new JButton("Test");
try
{
b.setIcon(new ImageIcon(ImageIO.read(new File("D:\\image.png"))));
}
catch (IOException e2)
{
}
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
}
});
getContentPane().add(b, BorderLayout.CENTER);
setSize(500,500);
setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args)
{
new Test();
}
}
你怎么知道它忽略了alpha通道。 以下代碼生成此屏幕截圖:
碼:
public static void main(String[] args) throws Exception {
URL url = new URL("http://upload.wikimedia.org/" +
"wikipedia/commons/4/47/PNG_transparency_demonstration_1.png");
Image image = ImageIO.read(url);
JPanel bgPanel = new JPanel(new BorderLayout()) {{
setOpaque(false);
}
protected void paintComponent(Graphics g) {
Rectangle r = g.getClipBounds();
// paint bg
int s = 10;
for (int y = r.y / s; y < r.y + r.height; y += s) {
int o = (y % (2*s) == 0 ? s : 0);
for (int x = r.x / s + o; x < r.x + r.width; x += 2*s)
g.fillRect(x, y, s, s);
}
super.paintComponent(g);
}
};
bgPanel.add(new JLabel(new ImageIcon(image)) {{
setOpaque(false);
}});
JFrame frame = new JFrame("Test");
frame.add(bgPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350, 300);
frame.setVisible(true);
}
根據我的經驗 - 使用JDK 1.6.0_21測試,Java imageio png解碼器部分支持透明度。 它支持帶有額外alpha通道(每像素32位)的24位全彩色圖像,以及帶有tRNS主干的索引彩色圖像,其中包含可與現有RGB調色板組合的alpha貼圖以定義哪種顏色是透明的。 但它不支持帶有tRNS中繼的24位RGB,其中包含圖像的單個透明RGB顏色值。 也許您的圖像是imageio不支持的格式之一。
您可以使用Sixlegs Java PNG解碼器 ,它沒有alpha透明度錯誤。 作為參考, Sun Java Bug#6371389討論了與PNG alpha通道類似的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.