主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GoogleAppEngineサーバでPILを使う Python -サーバとクライアントのファイルデータのやりとり

                
tags:
 GoogleAppEngineでPILが使えるようになっているので、これを使ったクライアントとの画像のやり取りをする。

 テキストデータでなら、話は単純だ。
textdata = self.request.get("text")
とでも書いて、テキストデータを加工して、クライアントに返してやればいい。

 これが画像データの場合どうだろう。とりあえず画像データを得る。
imagedata = self.request.get("image")
とでも書いて、ポストされた画像データを得る。次にPILで扱えるように、データをImageオブジェクトにしなければならない。そしてImageオブジェクトにしてPILを使って画像を加工する。加工した画像データをImageオブジェクトのデータのままクライアントに返しても、クライアントはなんだこりゃと困るしかない(クライアントもPILを使っていれば話は別だが)。しかるべき、JPEGやPNGなどのファイルデータにしなければならない。


 ローカルで画像を加工して保存する場合、以下のような流れになる。
from PIL import Image

img = Image.open("lenna.png")
new_img = img.im_feeling_fuckin() #実際にはImageオブジェクトにこんなメソッドはない
new_img.save("new_lennna.png", "PNG")

ファイル名で読み込む画像が指定され、それを加工し、新しくファイル名を指定して保存する。

 サーバとクライアントで画像をやりとりする場合、先述のimagedataにすでに画像データが入っている。だからImage.open()にファイル名ではない形でデータを渡せばいい。そんなときに使うのがStringIOモジュール。
http://docs.python.org/library/stringio.html

サーバ上ではデータの読み込みやフィニッシュ(保存など)のときにファイル名でのやり取りができない。データでのやり取りをせねばならない。そうするとこんなスクリプトになる。

imagedata = self.request.get("image")
input = StringIO.StringIO(imagedata)
img = Image.open(input)
new_img = img.im_feeling_fuckin() #実際にはImageオブジェクトにこんなメソッドはない
output = cStringIO.StringIO()
new_img.save(output, "PNG")
self.response.headers['Content-Type'] = 'image/png'
return self.response.out.write(output)

こう書くことでポストされた画像データをImageオブジェクトとして読み込み、outputにPNG画像としてのデータを入れることができる。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。