[Python] PIL使ってバナーの右下にイベント開催までの残り日数を表示
既存のバナー画像にイベント開催までの日数を書き込まなきゃならなくなったのでPythonのPILを試しに使ってみた。
準備
$ virtualenv PVE
$ cd PVE
$ bin/pip install PIL
スクリプト
# -*- coding: utf-8 -*- import sys import re from datetime import date import Image, ImageDraw, ImageFont, ImageColor def usage(): print "Usage: python %s image_file [fontsize]" % sys.argv[0] def num_of_days_left(filename): result = re.search("\d{4}-\d{1,2}-\d{1,2}", filename) days = 0 if result: param = result.group().split("-") due_date = date(int(param[0]), int(param[1]), int(param[2])) today = date.today() days = (due_date - today).days return days > 0 and days or 0 def draw_text_right_edge(canvas, text, font, fill): text_size = font.getsize(text) canvas_size = canvas.size x = canvas_size[0] - text_size[0] y = canvas_size[1] - text_size[1] pos = (x, y) draw = ImageDraw.Draw(canvas) draw.text(pos,text,font=font, fill=fill) def main(path, fontsize): canvas = Image.open(path) font = ImageFont.truetype("/usr/share/fonts/truetype/mona/mona.ttf", fontsize, encoding="utf-8") days = num_of_days_left(path) text = u"あと %d 日" % days fill = ImageColor.getrgb("white") draw_text_right_edge(canvas, text, font, fill) canvas.save(sys.stdout, "PNG") if __name__ == '__main__': if len(sys.argv) >= 2: path = sys.argv[1] else: usage() sys.exit(1) fontsize = 20 if len(sys.argv) >= 3: fontsize = int(sys.argv[2]) main(path, fontsize)
上記のスクリプトを適当なファイル名で保存して、以下のように実行すれば標準出力に画像が出力される。
bin/python スクリプト名 hoge_event_2010-08-2.png