使用PIL将图像保存为带压缩的TIFF时出现OSError

时间:2016-07-06 06:49:11

标签: python compression tiff pillow image-conversion

我正在尝试更改PNG图像的dpi并使用Pillow / PIL将其转换为TIFF,

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,它可以正常工作,但我最终得到了来自我的1MB PNG的100MB TIFF文件。如果我将压缩类型设置为任何可用的options,我最终会出现以下错误:

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并且不确定从哪里开始。

1 个答案:

答案 0 :(得分:1)

我被自己咬了一口,所以我觉得尽管有几个月的问题,我还是会分享我的发现。

tiff_jpeg压缩是指“旧式”JPEG编码的TIFF文件,现在已过时。使用compression='jpeg'代替compression='tiff_jpeg'为我工作。

compression目前可以在https://github.com/python-pillow/Pillow/blob/master/PIL/TiffImagePlugin.pyCOMPRESSION_INFO字典中找到tiff_lzw的可用选项。文档中未提及{{1}}压缩,但在Windows上使用Pillow 3.4为我创建LZW编码的TIFF。