1. ホーム
  2. python

[解決済み] PIL "IOError: image file truncated"(画像ファイルが切り捨てられました)と大きな画像について

2023-03-24 03:11:37

質問

この問題はゾープとは関係ないと思います。それでも、私がやろうとしていることを説明します。

FTPでZODBに画像をアップロードするためにZopeのPUT_factoryを使用しています。アップロードされた画像は新しく作成されたコンテナオブジェクトの中に Zope Image として保存されます。これは問題なく動作しますが、画像があるサイズ(幅と高さ)を超えたらリサイズしたいのです。そこで、PILのサムネイル機能を使って、200x200にリサイズしています。これは、アップロードされた画像が比較的小さいものであれば問題なく動作します。正確な上限は調べていませんが、976x1296pxならまだ大丈夫です。

より大きな画像で私は取得します。

Module PIL.Image, line 1559, in thumbnail
Module PIL.ImageFile, line 201, in load
IOError: image file is truncated (nn bytes not processed).

私のカメラで撮ったたくさんのjpegをテストしてみました。私は、それらがすべて切り捨てられるとは思わない。

以下は私のコードです。

if img and img.meta_type == 'Image':
  pilImg = PIL.Image.open( StringIO(str(img.data)) )
elif imgData:
  pilImg = PIL.Image.open( StringIO(imgData) )

pilImg.thumbnail((width, height), PIL.Image.ANTIALIAS)

PUT_factoryを使用しているので、ファイルオブジェクトはありません。ファクトリーからの生データか、以前に作成した(Zopeの)画像オブジェクトを使用しています。

PILは一定のサイズを超えると画像データの扱いが変わると聞いたことがありますが、自分のコードをどのように調整すればいいのかわかりません。それとも、PILのレイジーローディングと関係があるのでしょうか?

どのように解決すればよいですか?

私はここに返信するのが少し遅くなりましたが、同じような問題に遭遇したので、私の解決策を共有したいと思います。最初に、この問題の典型的なスタック トレースを示します。

Traceback (most recent call last):
  ...
  File ..., line 2064, in ...
    im.thumbnail(DEFAULT_THUMBNAIL_SIZE, Image.ANTIALIAS)
  File "/Library/Python/2.7/site-packages/PIL/Image.py", line 1572, in thumbnail
    self.load()
  File "/Library/Python/2.7/site-packages/PIL/ImageFile.py", line 220, in load
    raise IOError("image file is truncated (%d bytes not processed)" % len(b))
IOError: image file is truncated (57 bytes not processed)

220行目(あなたの場合は201行目、もしかしたら少し違うバージョンを実行しているかもしれません)のあたりを見てみると、PILはファイルのブロックを読み込んでいて、そのブロックが一定のサイズであることを期待していることがわかります。設定を変更することにより、切り詰められた (ブロックからいくつかのファイルが欠落した) ファイルを許容するように PIL に依頼できることがわかりました。

あなたのコード ブロックの前のどこかに、単に以下を追加します。

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

...そして、あなたは良いはずです。

編集:これはPillowにバンドルされているバージョンのPIL("pip install pillow")に役立ちますが、PILのデフォルトインストールでは動作しない可能性があるようです。