2007-09-27

Pythonでオンデマンド画像生成するには

どうすればいいのか。

PILのImage.tostringで'GIF'とかのエンコーディングを指定してもエラーになってしまう。GIF_encoderなどのメソッドがある事を期待しているが実際には定義されてないことが原因のようだ。なんか使い方間違ってるのか?

でもImage.saveでファイルへの保存はできるので結局こうした。


from cStringIO import StringIO
from PIL import Image, ImageDraw, ImageFont

from helloworld.lib.base import *

class HelloController(BaseController):

def test(self):
response.content_type = "image/gif"
im = Image.new("RGB", (40, 40))
font = ImageFont.load_default()
dr = ImageDraw.Draw(im)
dr.rectangle((0, 0, 40, 40), fill=(0, 0, 0))
dr.text((0, 0), 'Hello!!', fill=(255, 255, 255), font=font)
dr.text((0, 10), 'World?', fill=(200, 255, 255), font=font)
del dr
tmp = StringIO()
im.save(tmp, 'GIF')
return tmp.getvalue()



Image.saveの引数でファイル名のかわりにStringIOオブジェクトを渡せばメモリに書き込んでくれるので、あとはその文字列をreturnすればよい。
てか、Image.tostringというメソッドの名前からこういうことをやってくれると期待したんだけどな。