2010年7月25日日曜日

google app engine Images Python API  画像ファイルを読んで画像を表示させる

google app engineのImages APIを使おうと思って普通に一日ハマってたので防備録。
まず、画像ファイルを読み込むっていうサンプルが見つからなかった。
データストアのBlobProperty使うっていうのは割と見つかるんだけど。

以下はimageディレクトリにある画像ファイルhoge.pngを読み込んでImagesオブジェクト作り表示させる簡単なサンプル。
import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.api import images
import os


class MainHandler(webapp.RequestHandler):
  def get(self):
    imgdir = os.path.join(os.path.dirname(__file__), 'image')

    fp = open(imgdir + '/hoge.png','rb')
    data = fp.read()
    fp.close()
    img = images.resize(data, 32, 32)

    self.response.headers['Content-Type'] = "image/png"
    self.response.out.write(img)


  def main():
    application = webapp.WSGIApplication([
    ('/', MainHandler)
    ],
    debug=True)
    wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':
  main()
■ポイント1:読み込む画像が入ったディレクトリは静的ディレクトリにしない
上のサンプルではimageディレクトリにあるhoge.pngを読み込んでます。静的ディレクトリに指定されたものはスクリプトファイルから読めませんのでapp.yamlにはimageディレクトリをstaticで登録しちゃいけません。
以下の例ではimg_staticを静的ディレクトリに指定してますのでこの中のファイルは読むことができません。
application: hogehoge
version: 1
runtime: python
api_version: 1

handlers:
- url: /img_static
  static_dir: img_static

- url: .*
  script: main.py
■ポイント2:コンストラクタを使わない。
なんかうまくいかないので。どうやったらいいのかな?できると思うんだけど。
img = images.Image(data)

■参考にしたサイト
http://d.hatena.ne.jp/kwatch/20100415/1271285578#

0 件のコメント: