使用ImageIO编写具有透明度的BMP

时间:2017-08-03 14:29:43

标签: java bufferedimage javax.imageio bmp

有没有人有办法在Java中存储透明度为{B}的BufferedImage?最好使用ImageIO API。

出于某种原因,即使the BMP has supported alpha channel since, at least, Win95,我也无法以ARGB(BGRA)格式编写BMP。但是,我可以轻松地将相同的图像写为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 个答案:

答案 0 :(得分:1)

BMPImageWriterSpi中:

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

我担心Java不支持32位BMP。你必须自己编写或找到一个现有的库(想象一下我不知道ImageJ是否支持BMP)。维基百科非常详细地介绍了文件格式,它看起来非常简单,甚至提供了32位BMP的完整逐字段示例。