Запись BMP с прозрачностью с использованием ImageIO

У кого-нибудь есть способ сохранить BufferedImage с прозрачностью как BMP в Java? Предпочтительно использовать ImageIO API.

По какой-то причине я не могу написать BMP в формате ARGB (BGRA), хотя BMP поддерживает альфа-канал, по крайней мере, начиная с Win95. Однако я могу легко записать то же изображение в формате PNG. Он также отлично работает при сохранении изображения без альфы, например TYPE_INT_RGB или TYPE_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!

person Harald K    schedule 03.08.2017    source источник


Ответы (1)


В BMPImageWriterSpi:

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

Боюсь, Java не поддерживает 32-битные BMP. Вам придется написать свою собственную или найти существующую библиотеку (на ум приходит ImageJ, хотя я не знаю, поддерживает ли она BMP). Википедия очень подробно описывает формат файла, и он выглядит довольно просто, даже давая полный по полю пример 32-битного BMP.

person Mark Jeronimus    schedule 03.08.2017
comment
Спасибо! Я тоже нашел это, что весьма разочаровывает ... Я, вероятно, просто напишу свой собственный плагин BMP. Ведь формат довольно простой. :-) - person Harald K; 04.08.2017