[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


PILの使い方が何となく分かったような気がする。PIL使いやすいなぁ