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

Writing a BMP with transparency using ImageIO

有没有人有办法在 Java 中以 BMP 的形式存储透明的 BufferedImage?最好使用ImageIOAPI。

出于某种原因,我无法以 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!

BMPImageWriterSpi中:

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

恐怕 Java 不支持 32 位 BMP。您必须自己编写或查找现有的库(我想到了 ImageJ,但我不知道它是否支持 BMP)。维基百科对文件格式非常详细,看起来很简单,甚至给出了一个完整的 32 位 BMP 逐字段示例。