#daiizメモ

Scrapboxに夢中

【GAE/Python 解決済】IOError: cannot identify image file ...

Google App Engine(Python)のローカル開発環境で,Base64エンコードされたJPEGファイルをPIL(Python Image Library)にロードしようとしている. IOError: cannot identify image file というエラーが出て進めない.ぐぐったらcStringIOあるいはBytesIOを使う方法が出てきたので両方試してみたけどダメだった.

一昨日の作業終了時は普通に動いていたのが一番の謎.

とりあえず,GAEのローカル開発環境問題なのかPythonのコードが間違ってるのかを突き止めるために,GAEでない環境で動かしてみる.

追記

# coding: utf-8
from PIL import Image
import StringIO
import cStringIO
from io import BytesIO

if __name__ == '__main__':
    img_str = "data:image/jpeg;base64,/9j/..."
    img0 = StringIO.StringIO(img_str)
    img1 = cStringIO.StringIO(img_str)
    img2 = BytesIO(img_str)
    im = Image.open(img0)

最後の行の引数をimg0, img1, img2 として試したところ全部似たようなIOエラー

img0 => IOError: cannot identify image file <StringIO.StringIO instance at 0x...>
img1 => IOError: cannot identify image file <cStringIO.StringI object at 0x...>
img2 => IOError: cannot identify image file <_io.BytesIO object at 0x...>

img_strの接頭辞data:image/jpeg;base64,を外しても結果は同じ

追記

a2b_base64という関数を使ってimg_strをバイナリにする方法でPythonスクリプトを書いたところ動いた.

from PIL import Image
import StringIO
import cStringIO
from io import BytesIO
from binascii import a2b_base64

if __name__ == '__main__':
    img_str = "data:image/jpeg;base64,/9j/...".split("data:image/jpeg;base64,")[1]
    img3 = a2b_base64(img_str)
    a = StringIO.StringIO(img3)
    im = Image.open(a)

しかし,これをGAE環境に移植すると相変わらずエラーが出る.aに代入しているところまでは動いていて,imの行で落ちていることは確認できている.

cannot identify image file <StringIO.StringIO instance at 0x...>

一体どうすればいいんだ

解決報