Чтение BMP RGBA с использованием Python PIL не работает - PullRequest
1 голос
/ 07 июля 2019

Я пытаюсь прочитать BMP RGBA, используя python PIL, и это не похоже на работу.Следующий фрагмент кода показывает, что функция tenorflow bmp_decode успешно справляется с этой задачей, а PIL - нет:

def read_image_tf(filename):
    image_file = tf.read_file(filename, name='read_file')                    
    decoded_bmp = tf.io.decode_bmp(bmp_image)
    return decoded_bmp
def read_img_pil(filename):
    img = np.asarray(Image.open(fh))
    return img

img = K.eval(read_image_tf(<FILENAME>))
print (img.shape)
img = read_img_pil(<FILENAME>)
print (img.shape)

Вывод:

(3892, 3892, 4)
(3892, 3892, 3)

При попытке запустить imgobj.convert('RGBA') в Image.open(fh) Я просто получаю матрицу, которая содержит только значение 255 (100% прозрачность, которая не является правильным альфа-значением на пиксель).

Есть ли ошибка в PIL?Есть ли альтернатива чтению RGBA с использованием python?

1 Ответ

2 голосов
/ 07 июля 2019

PIL не поддерживает 32-битные растровые изображения.В официальной документации указано: -

Подушка для чтения и записи BMP-файлов Windows и OS / 2, содержащих 1, L, P или RGBданные.16-цветные изображения читаются как P-изображения.Кодировка длин серий не поддерживается.

Поэтому обычно рекомендуется не использовать Image.show() для просмотра изображения, поскольку оно преобразует изображение в .bmp перед его отображением.Поэтому, если изображение содержало альфа-значения (изображение цветового режима LA, RGBA и т. Д.), Отображаемое изображение не будет отображаться должным образом и будет иметь артефакты.

Поэтому при попытке открыть .bmp изображение, имеющее RGBA цветовое пространство в PIL, цветовое пространство усекается до RGB.

Пример: -

from PIL import Image

# creating an red colored image with RGBA color space and full opacity
img = Image.new("RGBA", (100, 100), (255, 0, 0, 255))

# displaying the color mode of the image
print(img.mode)

# saving the image as a .bmp (bitmap)
img.save("new.bmp")

# Opening the previously saved .bmp image (having color mode RGBA)
img = Image.open("new.bmp")

# displaying the mode of the .bmp file
print(img.mode)

ВЫХОД: -

RGBA
RGB
...