Поддержка / распаковка изображений RLE8 с помощью подушки (вилка PIL) - PullRequest
0 голосов
/ 03 октября 2018

Я использую Pillow (версия 5.2.0) на Python3, чтобы открывать изображения PNG и BMP и отображать их с помощью графического интерфейса Tkinter.Изображения PNG отображаются правильно, без проблем, однако я сталкиваюсь с IOError («Неподдерживаемое сжатие BMP») с некоторыми изображениями BMP, когда используется BmpImagePlugin.py Подушки.

Использование растрового плагина source и некоторые операторы печати, я обнаружил, что исключение выдается в строке 193, и что изображения, вызывающие исключение, сжимаются с использованием RLE8 (обозначается словарем в строке 63);все остальные работают, потому что они в формате RAW.Мне кажется, что если тип сжатия указан в этом словаре, он должен поддерживаться, но, очевидно, это не так.

Мой вопрос: кто-нибудь знает об обходном пути в Pillow или какой-либо другой библиотеке Python, которая может открывать растровые изображения RLE8?Вот изображение, отображающее мою среду PATH, а также ошибку командной строки, описанную в комментарии ниже.

Edit:

Проблемы с путями

2nd Edit

1 Ответ

0 голосов
/ 22 октября 2018

Я отмечаю, что ваше первое изображение (test1.bmp) кажется поврежденным, а ImageMagick сообщает, что оно имеет неправильную длину.

Ваше второе изображение, по-видимому, не сжато с помощью сжатия RLE8и также является изображением в палитре, но с альфа / прозрачностью.

Ваше третье изображение на паллетах, не альфа с сжатием RLE8.

Моя версия PIL может читать только второй файл -первый и третий, которые в кодировке RLE, не могут быть прочитаны.


Вы попросили обойти это решение - могу ли я предложить pyvips, который может читать файлы без проблем:

import pyvips
from PIL import Image

# Load troublesome file using vips, and write to a memory buffer
image = pyvips.Image.new_from_file('test1.bmp')
mem_img = image.write_to_memory()

# Read from memory buffer into Numpy array
imgnp=np.frombuffer(mem_img, dtype=np.uint8).reshape(image.height, image.width, 3)
# Convert Numpy array to PIL Image and write to disk
Image.fromarray(imgnp).save('result.png')
...