Google App Engine(Python)のローカル開発環境で,Base64エンコードされたJPEGファイルをPIL(Python Image Library)にロードしようとしている.
IOError: cannot identify image file
というエラーが出て進めない.ぐぐったらcStringIO
あるいはBytesIO
を使う方法が出てきたので両方試してみたけどダメだった.
GAE/Py で data:image/jpeg;base64, された画像をPILでImage.openしようとしてる.幾つかの方法ググっ手試したけどどれも IOError: cannot identify image file となり落ちる
— daiiz (@daizplus) September 16, 2016
cStringIO と BytesIO 試したけどダメ
— daiiz (@daizplus) September 16, 2016
一昨日の作業終了時は普通に動いていたのが一番の謎.
とりあえず,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...>
一体どうすればいいんだ