Как сохранить прогрессивный JPEG с помощью Python PIL 1.1.7? - PullRequest
19 голосов
/ 22 июля 2011

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

Вот мой 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 МБ)

Ответы [ 3 ]

34 голосов
/ 22 июля 2011
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 кодирует часть изображения за раз.Это несовместимо с опциями «оптимизации» и «прогрессивного».

Редактировать : вам нужно import PIL.Image, PIL.ImageFile для более новых версий PIL / Pillow.

17 голосов
/ 22 июля 2011

Вот хак, который может сработать, но вам может понадобиться увеличить размер буфера:

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)
3 голосов
/ 10 сентября 2013

Если вы установили PIL с помощью pip, удалите его и установите подушку.Библиотека подушек имеет передовую версию библиотеки PIL.ПИЛ из пипса слишком стар.Если вы обновите подушку вместо PIL, вам не нужно устанавливать PIL.ImageFile.MAXBLOCK.Об этом позаботятся автоматически.

Если вы использовали подмодуль git или просто загрузили исходный код PIL для репо, убедитесь, что вы загрузили последний источник с GitHub и используете его.

...