[解決済み] PIL "IOError: image file truncated"(画像ファイルが切り捨てられました)と大きな画像について
質問
この問題はゾープとは関係ないと思います。それでも、私がやろうとしていることを説明します。
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のデフォルトインストールでは動作しない可能性があるようです。
関連
-
[解決済み] Matplotlibでプロットを表示するのではなく、画像ファイルに保存する。
-
[解決済み] PILを使用して画像のサイズを変更し、縦横比を維持するにはどうすればよいですか?
-
[解決済み] PILで画像サイズを取得する方法を教えてください。
-
[解決済み】PILイメージをnumpyの配列に変換する方法は?
-
[解決済み】Python Image Libraryが "decoder JPEG not available "というメッセージで失敗する件 - PIL
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] バブルソートの宿題
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?