web-dev-qa-db-ja.com

Python PIL 1.1.7を使用してプログレッシブJPEGを保存する方法は?

次の呼び出しで保存しようとするとエラーが発生しますが、プログレッシブオプションと最適化オプションを削除すると保存されます。

動作しない私の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)

21
Andrey Kuzmin

これはうまくいくかもしれないハックですが、バッファをさらに大きくする必要があるかもしれません:

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)
21
Eryk Sun
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 /枕。

35
agf

ピップを使用してPILをインストールした場合は、アンインストールして枕をインストールします。枕ライブラリには、PILライブラリのEdgeバージョンが含まれています。ピップからのPILが古すぎます。 PILの代わりに枕に更新する場合、PIL.ImageFile.MAXBLOCKを設定する必要はありません。自動的に処理されます。

リポジトリにPILソースコードをダウンロードしただけのgitサブモジュールを使用した場合は、GitHubから最新のソースをダウンロードして使用してください。

3
dhilipsiva