Вопрос по python – Загрузить растровое изображение RGBA с PIL

6

Я пытался преобразовать 32-битное растровое изображение в 32-битный PNG, используя PIL.

<code>from PIL import Image
im = Image.open('example.bmp')
print im.mode
# it prints 'RGB', but expected was 'RGBA'
im.save('output.png', format='PNG')
</code>

Ожидаемый режим изображения - «RGBA», но фактически я получаю «RGB».

Я также попробовал следующий код, но он не работает.

<code>from PIL import Image
im = Image.open('example.bmp')
im = im.convert('RGBA')
im.save('output.png', format='PNG')
</code>
Я думаю, что 32-битный растровый файл - это нестандартный формат, который не поддерживает PIL. Попытка записать изображение RGBA в .bmp приводит к ошибкеcannot write mode RGBA as BMP. Mark Ransom

Ваш Ответ

2   ответа
0

и BMP.

Если я хорошо помню, похоже, что wxPython правильно с ними работает. Я написал небольшую обертку между ними около года назад, только если смог найти код.

3

вот с чего начать. Поскольку я не знаю точно, какой формат является вашим файлом BMP, я обработал только конкретный случай BMP с полным альфа-каналом, который у меня получился. Тип обработки BMP, который здесь используется, может быть получен путем преобразования, например, PNG с альфа в BMP с использованием ImageMagick. Это создаст то, что называется «BITMAPV5». Учитывая ваше описание, у вас нет BitmapV5 (потому что PIL даже не откроет его), поэтому нам понадобится итерация с обсуждениями для решения вашего конкретного случая.

Итак, вам либо нужен новый декодер файлов или пропатченBmpImagePlugin.py, Как это сделать, описано в руководстве PIL. Для последующего вам, очевидно, нужно будет отправить патч и надеяться получить его в следующей версии PIL. Я сосредоточен на создании нового декодера:

from PIL import ImageFile, BmpImagePlugin

_i16, _i32 = BmpImagePlugin.i16, BmpImagePlugin.i32

class BmpAlphaImageFile(ImageFile.ImageFile):
    format = "BMP+Alpha"
    format_description = "BMP with full alpha channel"

    def _open(self):
        s = self.fp.read(14)
        if s[:2] != 'BM':
            raise SyntaxError("Not a BMP file")
        offset = _i32(s[10:])

        self._read_bitmap(offset)

    def _read_bitmap(self, offset):

        s = self.fp.read(4)
        s += ImageFile._safe_read(self.fp, _i32(s) - 4)

        if len(s) not in (40, 108, 124):
            # Only accept BMP v3, v4, and v5.
            raise IOError("Unsupported BMP header type (%d)" % len(s))

        bpp = _i16(s[14:])
        if bpp != 32:
            # Only accept BMP with alpha.
            raise IOError("Unsupported BMP pixel depth (%d)" % bpp)

        compression = _i32(s[16:])
        if compression == 3:
            # BI_BITFIELDS compression
            mask = (_i32(self.fp.read(4)), _i32(self.fp.read(4)),
                    _i32(self.fp.read(4)), _i32(self.fp.read(4)))
            # XXX Handle mask.
        elif compression != 0:
            # Only accept uncompressed BMP.
            raise IOError("Unsupported BMP compression (%d)" % compression)

        self.mode, rawmode = 'RGBA', 'BGRA'

        self.size = (_i32(s[4:]), _i32(s[8:]))
        direction = -1
        if s[11] == '\xff':
            # upside-down storage
            self.size = self.size[0], 2**32 - self.size[1]
            direction = 0

        self.info["compression"] = compression

        # data descriptor
        self.tile = [("raw", (0, 0) + self.size, offset,
            (rawmode, 0, direction))]

Чтобы правильно использовать это, якобы канонический способ должен выполнить:

from PIL import Image
Image.register_open(BmpAlphaImageFile.format, BmpAlphaImageFile)
# XXX register_save

Image.register_extension(BmpAlphaImageFile.format, ".bmp")

Проблема в том, что уже существует плагин для обработки ".bmp", и я не удосужился выяснить, как я могу добавить это новое расширение, чтобы оно использовалось до использования BmpImagePlugin (я также не знаю, если оно можно сделать такую вещь в ПИЛ). Сказал, что я на самом деле использовал код напрямую, как в:

from BmpAlphaImagePlugin import BmpAlphaImageFile

x = BmpAlphaImageFile('gearscolor.bmp')
print x.mode
x.save('abc1.png')

Где gearscolor.bmp - это образец растрового изображения с полным альфа-каналом, как описано ранее. Полученный PNG сохраняется с альфа-данными. Если вы проверитеBmpImagePlugin.pyВы заметите, что я использовал большую часть его кода.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded stanleyxu2005
Error: User Rate Limit Exceeded

Похожие вопросы