OSError при использовании PIL для сохранения изображения в формате TIFF со сжатием

Я пытаюсь изменить dpi моих изображений PNG и преобразовать их в TIFF, используя Pillow / PIL, например,

from PIL import Image
import os

for fl in os.listdir(os.getcwd()):
    name, ext = fl.split(".")
    im = Image.open(fl)
    im.save(name + ".tiff", dpi=(500,500), compression="tiff_jpeg")

    print("Done '{}'".format(name))

который отлично работает, если compression kwarg не установлен, но я получаю огромные файлы TIFF размером 100 МБ из моих PNG размером 1 МБ. Если я установил для типа сжатия любой из доступных параметров, я получаю следующую ошибку:

Traceback (most recent call last):

  File "<ipython-input-1-3631f05e05f4>", line 7, in <module>
    im.save(name + ".tiff", dpi=(500,500), compression="tiff_jpeg")

  File "C:\Users\Patrick\Anaconda3\lib\site-packages\PIL\Image.py", line 1687, in save
    save_handler(self, fp, filename)

  File "C:\Users\Patrick\Anaconda3\lib\site-packages\PIL\TiffImagePlugin.py", line 1457, in _save
    raise IOError("encoder error %d when writing image file" % s)

OSError: encoder error -2 when writing image file

В документации для Image.save в нем упоминается, что сжатие доступно только в том случае, если установлена ​​библиотека libtiff, которая у меня есть.

Вот версии Python и Pillow, с которыми я работаю:

Python 3.5.1 |Anaconda 4.0.0 (64-bit)| (default, Feb 16 2016, 09:49:46) [MSC v.1900 64 bit (AMD64)] on win32

libtiff: 4.0.6-vc14_2 [vc14]
pillow: 3.2.0-py35_1 

В чем может быть причина этой ошибки и что я могу предпринять для ее устранения? Я впервые использовал Pillow / PIL и не знаю, с чего начать.


person pbreach    schedule 06.07.2016    source источник


Ответы (1)


Я только что укусил меня, поэтому решил поделиться своими находками, несмотря на то, что вопрос был задан несколько месяцев назад.

Сжатие tiff_jpeg относится к файлам TIFF "старого стиля" в кодировке JPEG и теперь устарело. Использование compression='jpeg' вместо compression='tiff_jpeg' у меня сработало.

Доступные параметры для compression в настоящее время можно найти в COMPRESSION_INFO dict по адресу https://github.com/python-pillow/Pillow/blob/master/PIL/TiffImagePlugin.py. Сжатие tiff_lzw также не упоминается в документации, но сработало для создания TIFF с кодировкой LZW для меня, используя Pillow 3.4 в Windows.

person Gary Hughes    schedule 06.12.2016
comment
Теперь для меня работает только tiff_lzw, в то время как оба jpeg по-прежнему выдают ту же ошибку, что и `tiff_jpeg. - person pbreach; 06.12.2016