mieki256's diary



2013/07/28() [n年前の日記]

#1 [prog] 高橋メソッドを画像として保存するPythonスクリプトを書いた

今頃高橋メソッドかよと言われそうな気もするけど。とりあえず、Python + PIL で書いてみた。

出力画像をアニメ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で
調整してね

フォントサイズをスクリプト内で変えて、自動で画面一杯に文字を描けないかと思ったけれど。フォントサイズがパカパカ変わるのは見ていて何か妙な感じがするのでは、と思えてきたので、一定のフォントサイズで書くことに。ただ、処理自体は書けそうな気もする。 あるいは、以下のようなやり方でも、できるのかも。 ただ、このやり方だと拡大縮小がかかるから、ページ?毎にフォントのぼやけ具合が変わりそうだなと。

2013/08/02追記。 :

ヘルプメッセージがおかしかったので、そこだけ修正してアップロードし直し。

以上です。

過去ログ表示

Prev - 2013/07 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project