2013/07/28(日) [n年前の日記]
#1 [prog] 高橋メソッドを画像として保存するPythonスクリプトを書いた
今頃高橋メソッドかよと言われそうな気もするけど。とりあえず、Python + PIL で書いてみた。
出力画像をアニメgifにしてみたり。
一応置いとくです。
_takahashi_method.py.txt (DL後、拡張子を.pyに変更のこと)
_mes.txt (表示テキストを記述したファイル。SJISで記述)
コマンドラインオプションはこんな感じ。
中身はこんな感じ。
takahashi_method.py
mes.txt。SJISで記述。区切りは「----」。
フォントサイズをスクリプト内で変えて、自動で画面一杯に文字を描けないかと思ったけれど。フォントサイズがパカパカ変わるのは見ていて何か妙な感じがするのでは、と思えてきたので、一定のフォントサイズで書くことに。ただ、処理自体は書けそうな気もする。
出力画像をアニメgifにしてみたり。
一応置いとくです。
_takahashi_method.py.txt (DL後、拡張子を.pyに変更のこと)
_mes.txt (表示テキストを記述したファイル。SJISで記述)
コマンドラインオプションはこんな感じ。
>takahashi_method.py --help Usage: takahashi_method.py [option] Options: --version show program's version number and exit -h, --help show this help message and exit --font=FILE use TTF filename [default: HGRSGU.TTC] --fontsize=INT font size [default: 160] --width=INT image width [default: 1280] --height=INT image height [default: 720] -i FILE, --input=FILE input text file [default: mes.txt] --debug debug
takahashi_method.py -i mes.txt takahashi_method.py -i mes.txt --width 640 --height 360 --fontsize 72
中身はこんな感じ。
takahashi_method.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- mode: python;Encoding: utf8n -*- u'''高橋メソッドで画像保存するPythonスクリプト. usage : takahashi_method.py -i textfile takahashi_method.py --help テキストは sjis で記述のこと。 Windows7 x64 + Python 2.6.6 + PIL 1.1.7 で動作確認した。 標準では HGRSGU.TTC (HGP創英角ゴシックUB) を使用。 HGRHM9.TTC (HGP平成明朝体W9) を使うのもいいかもしれない。 フォント指定は絶対パスで指定するべきだが、 Windows上では、警告が出るものの、 フォントファイル名を指定するだけでも動くように見える。 ''' import os import codecs from PIL import Image, ImageDraw, ImageFont from optparse import OptionParser def main(): p = OptionParser(usage="usage: %prog [option]", version="%prog 0.01") p.add_option("--font", help="use TTF filename [default: %default]", metavar="FILE", default='HGRSGU.TTC') p.add_option("--fontsize", help="font size [default: %default]", metavar="INT", default=160) p.add_option("--width", help="image width [default: %default]", metavar="INT", default=1280) p.add_option("--height", help="image height [default: %default]", metavar="INT", default=720) p.add_option("-i", "--input", help="input text file [default: %default]", metavar="FILE", default="mes.txt") p.add_option( "--debug", help="debug", action="store_true") (opts, args) = p.parse_args() sw, sh = int(opts.width), int(opts.height) fnt = ImageFont.truetype(opts.font, int(opts.fontsize), encoding='shift_jis') all_lines = codecs.open(opts.input, 'r', 'shift_jis').read() count = 0 for page in all_lines.split("----"): lines = page.strip().splitlines() im = Image.new('RGB', (sw, sh), 'white') draw = ImageDraw.Draw(im) w, h = draw.textsize(lines[0], fnt) spacing = h / 4 fsize_h = h + spacing y = (sh - (fsize_h * len(lines) - spacing)) / 2 for s in lines: w, h = draw.textsize(s, fnt) draw.text(((sw - w) / 2, y), s, font = fnt, fill='black') y += fsize_h if opts.debug: im.show() else: im.save("%04d.png" % count, 'PNG') count += 1 if __name__ == '__main__': main()
mes.txt。SJISで記述。区切りは「----」。
高橋メソッドを 画像保存 ---- 今頃かよと 言われそう ---- でも 気にしない ---- Python+PILで 実装 ---- テキストは SJISで書く ---- 「-」を4つ書くと ページ区切り ---- オプション 指定可能 --help とか ---- 文字が画像から はみだしちゃう時も あるけれど ---- --fontsizeで 調整してね
フォントサイズをスクリプト内で変えて、自動で画面一杯に文字を描けないかと思ったけれど。フォントサイズがパカパカ変わるのは見ていて何か妙な感じがするのでは、と思えてきたので、一定のフォントサイズで書くことに。ただ、処理自体は書けそうな気もする。
- ttfを使うための初期設定をする際に、異なるフォントサイズでいくつか用意してリストやハッシュに突っ込んで。
- フォントを描画する前に、.textsize() でフォント描画サイズを取得。
- 画像からはみ出すようなら、小さいフォントを選び直して、画像内にギリギリに収まるフォントサイズを得るまで再試行。
- 一旦別画像にフォント描画。
- 画像サイズに縮小して貼り付け。
◎ 2013/08/02追記。 :
ヘルプメッセージがおかしかったので、そこだけ修正してアップロードし直し。
[ ツッコむ ]
以上です。