2017-08-03 121 views
0

有没有人有办法将透明度为BufferedImage的BMP存储在Java中?最好使用ImageIO API。使用ImageIO写入带有透明度的BMP

出于某种原因,我无法在ARGB(BGRA)格式中写入BMP,即使the BMP has supported alpha channel since, at least, Win95。但是,我可以轻松地将相同的图像编写为PNG。它也可以很好地存储没有alpha的图像,如TYPE_INT_RGBTYPE_3BYTE_BGR

考虑下面的代码片段:

public static void main(String[] args) throws IOException { 
    if (!ImageIO.write(new BufferedImage(300, 200, BufferedImage.TYPE_INT_ARGB), "BMP", new File("foo.bmp"))) { 
     System.err.println("Couldn't write BMP!"); 
    } 
    if (!ImageIO.write(new BufferedImage(300, 200, BufferedImage.TYPE_INT_ARGB), "PNG", new File("foo.png"))) { 
     System.err.println("Couldn't write PNG!"); 
    } 
} 

输出:

Couldn't write BMP! 

回答

1

BMPImageWriterSpi

public boolean canEncodeImage(ImageTypeSpecifier type) { 
    ... 
    if (!(numBands == 1 || numBands == 3)) 
     return false; 

恐怕Java不支持32位BMP的。你必须自己编写或找到一个现有的库(想到ImageJ,尽管我不知道它是否支持BMP)。维基百科对文件格式非常详尽,它看起来相当简单,甚至可以提供完整的32位BMP的逐场示例。

+0

谢谢!我也发现,这非常令人失望......我可能只会写我自己的BMP插件。毕竟,格式非常简单。 :-) – haraldK