Как сохранить прогрессивную jpeg с помощью Python PIL 1.1.7?
Я пытаюсь сохранить со следующим вызовом, и он вызывает ошибку, но если я удаляю прогрессивные и оптимизирующие параметры, он сохраняет.
Вот мой 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)
Ответы
Ответ 1
Вот хак, который может работать, но вам может понадобиться сделать буфер еще большим:
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
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 кодирует часть изображения за раз. Это несовместимо с опциями "optimize" и "progressive".
Изменить: вам нужно import PIL.Image, PIL.ImageFile
для новых версий PIL/Pillow.
Ответ 3
Если вы установили PIL, используя pip, удалите его и установите подушку. У библиотеки подушек есть сводная версия библиотеки PIL с ней. PIL из pip слишком стар. Если вы обновляете подушку вместо PIL, вам не нужно устанавливать PIL.ImageFile.MAXBLOCK. Это берется автоматически.
Если вы использовали подмодуль git только для исходного кода PIL, загруженного в репо, убедитесь, что вы загружаете последний источник из GitHub и используете его.