Andrey Kuzmin
Andrey Kuzmin

Reputation: 4479

How to save progressive jpeg using Python PIL 1.1.7?

I'm trying to save with the following call and it raises error, but if i remove progressive and optimize options, it saves.

Here is my test.py that doesn't work:

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

It raises this error:

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

Link to image: http://static.cafe.nov.ru/in.jpg (4.3 mb)

Upvotes: 27

Views: 43768

Answers (3)

dhilipsiva
dhilipsiva

Reputation: 3718

If you have installed PIL using pip, uninstall it and instal pillow. The pillow library has the edge version of PIL library with it. The PIL from pip is too old. If you update to pillow instead of PIL, you don't have to set PIL.ImageFile.MAXBLOCK. It is taken care of automatically.

If you used git submodule of just have PIL source code downloaded in to repo, make sure you download the latest source from GitHub and use it.

Upvotes: 4

agf
agf

Reputation: 176730

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 encodes part of the image at a time. This is incompatible with the 'optimize' and 'progressive' options.

Edit: You need to import PIL.Image, PIL.ImageFile for newer versions of PIL / Pillow.

Upvotes: 41

Eryk Sun
Eryk Sun

Reputation: 34270

Here's a hack that might work, but you may need to make the buffer even larger:

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)

Upvotes: 27

Related Questions