如何使用Python PIL 1.1.7保存渐进式jpeg?

时间:2011-07-22 09:58:34

标签: python python-imaging-library

我正在尝试使用以下调用进行保存并引发错误,但如果我删除渐进式和优化选项,则会保存。

这是我的test.py不起作用:

import Image
img = Image.open("in.jpg")
img.save("out.jpg", "JPEG", quality=80, optimize=True, progressive=True)

它引发了这个错误:

Suspension not allowed here
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    img.save("out.jpg", "JPEG", quality=80, optimize=True, progressive=True)
  File "/Library/Python/2.6/site-packages/PIL/Image.py", line 1439, in save
    save_handler(self, fp, filename)
  File "/Library/Python/2.6/site-packages/PIL/JpegImagePlugin.py", line 471, in _save
    ImageFile._save(im, fp, [("jpeg", (0,0)+im.size, 0, rawmode)])
  File "/Library/Python/2.6/site-packages/PIL/ImageFile.py", line 501, in _save
    raise IOError("encoder error %d when writing image file" % s)
IOError: encoder error -2 when writing image file

链接到图片:http://static.cafe.nov.ru/in.jpg(4.3 mb)

3 个答案:

答案 0 :(得分:34)

import PIL
from exceptions import IOError

img = PIL.Image.open("c:\\users\\adam\\pictures\\in.jpg")
destination = "c:\\users\\adam\\pictures\\test.jpeg"
try:
    img.save(destination, "JPEG", quality=80, optimize=True, progressive=True)
except IOError:
    PIL.ImageFile.MAXBLOCK = img.size[0] * img.size[1]
    img.save(destination, "JPEG", quality=80, optimize=True, progressive=True)

PIL一次编码部分图像。这与'优化'和'渐进'选项不兼容。

修改:对于较新版本的PIL / Pillow,您需要import PIL.Image, PIL.ImageFile

答案 1 :(得分:17)

这是一个可能有用的黑客,但你可能需要让缓冲区更大:

from PIL import Image, ImageFile

ImageFile.MAXBLOCK = 2**20

img = Image.open("in.jpg")
img.save("out.jpg", "JPEG", quality=80, optimize=True, progressive=True)

答案 2 :(得分:3)

如果您使用pip安装了PIL,请将其卸下并安装枕头。枕头库带有边缘版本的PIL库。来自pip的PIL太旧了。如果您更新到枕头而不是PIL,则不必设置PIL.ImageFile.MAXBLOCK。它会自动处理。

如果您使用的git子模块只需将PIL源代码下载到repo中,请确保从GitHub下载最新的源代码并使用它。