[Python] PIL使って画像に半透明な文字を入れる

Python Image Library(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 [alpha] [fontsize] [fontpath]" % sys.argv[0]
  
def draw_transparent_text(src_canvas, text, pos, font, fill, alpha):
    mask = Image.new("L", src_canvas.size, 1)
    text_canvas = Image.new("RGB", src_canvas.size, "#000000")
    text_canvas.putalpha(mask)

    draw = ImageDraw.Draw(text_canvas)
    draw.text(pos, text, font=font, fill=fill)
    del draw

    src_canvas.putalpha(mask)
    return Image.blend(src_canvas, text_canvas, alpha).convert("RGB")
    

def main(path, alpha, fontsize, fontpath):
    canvas = Image.open(path)
    canvas_size = canvas.size
    font = ImageFont.truetype(fontpath, fontsize, encoding="utf-8")
    text = u"テスト"
    fill = ImageColor.getrgb("white")
    canvas = draw_transparent_text(canvas, text, pos=(0, 0), font=font,
            fill=fill, alpha=alpha)
    canvas.save(sys.stdout, "PNG")

if __name__ == '__main__':
    if len(sys.argv) >= 2:
        path = sys.argv[1]
    else:
        usage()
        sys.exit(1)

    alpha = 0.5
    if len(sys.argv) >= 3:
        alpha = float(sys.argv[2])

    fontsize = 14
    if len(sys.argv) >= 4:
        fontsize = int(sys.argv[3])

    fontpath = "/usr/share/fonts/truetype/mona/mona.ttf"
    if len(sys.argv) >= 5:
        fontsize = sys.argv[5]

    main(path, alpha=alpha, fontsize=fontsize, fontpath=fontpath)

このスクリプトに画像を渡してあげると半透明な文字が入力された画像が標準出力に返される。

bin/python スクリプト名 hoge.png

元の画像

送信者 空の様子 - まとめ用


スクリプト適当過ぎるけど半透明の文字が入力できたので今日は満足。画像処理関連は弱いけどPILのおかげで色々できそう。ライブラリ偉大だな。