読者です 読者をやめる 読者になる 読者になる

デザインのメモ

ロゴやフォント、フォトショ・イラレのお話をします

Python フォントの画像化プログラム

フォントの判別プログラムを作った際に使った、各フォントの画像を作るプログラムです。
まずプログラム本体です。

fonttoimage.py

# -*- coding: utf-8 -*-
import os
import sys
import glob
import argparse
from PIL import Image, ImageDraw, ImageFont

parser = argparse.ArgumentParser(description='Font to Image')
parser.add_argument('--directory', '-d', default='fonts',
                    help='Directory of fonts')
parser.add_argument('--imagesize', '-i', type=int, default=64,
                    help='Size of image')
parser.add_argument('--resize', '-r', type=int, default=64,
                    help='Size of resize')
parser.add_argument('--fontsize', '-f', type=int, default=48,
                    help='Size of font')
parser.add_argument('--out', '-o', default='images',
                    help='Directory to output the image')
args = parser.parse_args()
		
def lettertoimage(i, font, fontname):
	draw.line((0, 0) + (args.imagesize, args.imagesize), fill=255, width=args.imagesize * 2)
	draw.text((fontplace, fontplace), chr(i), font=font, fill=0)
	canvas.resize((args.resize, args.resize)).save('{0}/{1}/{2}_{3}.png'.format(args.out, fontname, i, args.fontsize))
	return 0

def lettershow(num, fontpath):
	fontname, ext = os.path.splitext(os.path.basename(fontpath))
	font = ImageFont.truetype(fontpath, args.fontsize)
	if not os.path.exists('{0}/{1}'.format(args.out, fontname)):
		os.mkdir('{0}/{1}'.format(args.out, fontname))
	[lettertoimage(i, font, fontname) for i in range(ord('0'), ord('9') + 1)]
	[lettertoimage(i, font, fontname) for i in range(ord('A'), ord('Z') + 1)]
	[lettertoimage(i, font, fontname) for i in range(ord('a'), ord('z') + 1)]
	[lettertoimage(i, font, fontname) for i in range(ord('ぁ'), ord('ん') + 1)]
	[lettertoimage(i, font, fontname) for i in range(ord('ァ'), ord('ヶ') + 1)]
	print(num)
	return 0

if not os.path.exists(args.out):
	os.mkdir(args.out)
canvas = Image.new('L', (args.imagesize, args.imagesize), (255))
draw = ImageDraw.Draw(canvas)

fontplace = (args.imagesize - args.fontsize) // 2
fontfile = glob.glob('{}/*'.format(args.directory))
print(len(fontfile))

[lettershow(num, fontpath) for num, fontpath in enumerate(fontfile)]

使い方
フォントデータをfontsというフォルダを作りその中に入れます。

python fonttoimage.py

デフォルトの設定では
・フォントデータ:./fonts/
・出力先:./images/
・画像サイズ:64x64
・フォントサイズ:48
・出力文字:数字、アルファベット、ひらがな、カタカナ

実行オプション
・-d フォントデータのフォルダ
・-i 元画像サイズ
・-r 画像リサイズ
・-f フォントサイズ
・-o 出力フォルダ

python fonttoimage.py -i 128 -f 120

画像を128x128で作り、そこにフォントサイズ120で文字を描写し、最終的に64x64に縮小し、出力します。