90

この問題は Zope 関連ではないと思います。それにもかかわらず、私がやろうとしていることを説明します:

Zope で PUT_factory を使用して、FTP ごとに ZODB に画像をアップロードしています。アップロードされたイメージは、新しく作成されたコンテナ オブジェクト内に Zope イメージとして保存されます。これで問題なく動作しますが、画像が特定のサイズ (幅と高さ) を超える場合はサイズを変更したいと考えています。そのため、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) Image オブジェクトのいずれかを使用しています。

特定のサイズを超えると PIL が画像データを別の方法で処理すると聞いたことがありますが、コードを調整する方法がわかりません。それとも、PIL の遅延読み込みに関連していますか?

4

6 に答える 6

217

ここで返信するのが少し遅れましたが、同様の問題に遭遇したため、解決策を共有したいと思いました. まず、この問題の典型的なスタック トレースを次に示します。

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 のデフォルトのインストールでは機能しない可能性があります。

于 2014-05-09T23:26:17.013 に答える
13

最良のことは、次のことができることです。

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

try:
    pilImg.load()
except IOError:
    pass # You can always log it to logger

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

ばかげているように見えますが、奇跡のように機能します。画像にデータがない場合は、グレーで塗りつぶされます (画像の下部を確認してください)。

注: Python でのキャメル ケースの使用は推奨されておらず、クラス名でのみ使用されます。

于 2013-11-19T10:00:21.617 に答える
4

これは PIL の問題ではない可能性があります。HTTP サーバーの設定に関連している可能性があります。HTTP サーバーは、受け入れられるエンティティ本体のサイズに制限を設けています。

たとえば、Apache FCGI では、オプション FcgidMaxRequestLen によって、アップロードできるファイルの最大サイズが決まります。

サーバーを確認してください - アップロード サイズを制限しているサーバーである可能性があります。

于 2012-10-21T05:13:14.747 に答える
0

これを防ぐには、tds のバージョンを 7.2 に変更する必要がありました。tds バージョン 8.0 でも動作しますが、8.0 には他にもいくつか問題がありました。

于 2014-12-19T20:21:55.680 に答える