しろもじメモランダム

文字についてあれこれと。

てきとうに書いて作ったフォントができるまで(5)

てきとうに書いて作ったフォントについて、(1), (2), (3), (4) の続き。

Potrace で SVG に変換

動画中でも触れたとおり、文字ごとに切り分けただけでは画像はラスタイメージのままである。今回作ろうとしているのものは、ビットマップフォントではなくアウトラインフォント*1なので、ここから画像をベクタイメージに変換する必要がある。アウトラインを手作業でトレースしていたら日が暮れてしまうので、ここでは Potrace というツールで一気に変換する。

動画の中ではこんな感じで Perl から動かしているが、

#!/usr/bin/perl
#
# グリフ画像(out/pgm/uxxxx.pgm)を、potraceでSVG(out/svg/uxxxx.svg)に変換
#
# usage: perl pgm2svg.pl [alphamax] [blacklevel]

use strict;
use warnings;
use File::Basename;

foreach (<out/pgm/u*.pgm>) {
  print "transform: $_\n";
  system("potrace -s -a $ARGV[0] -k $ARGV[1] $_ -W 10cm -H 10cm -o out/svg/"
         . fileparse($_, '.pgm') . ".svg" );
}

exit;

よくよく考えてみると、単純に

$ potrace -s -a 1 -k 0.9 out/pgm/u*.pgm -W 10cm -H 10cm

とするだけでも用は足りる*2 *3。使っているオプションの意味は次の通り。

オプション 内容
-s SVG で出力(デフォルトでは EPS で出力される)
-a n 角となる閾値(どれぐらい尖っていれば頂点とみなすか、デフォルトは1)
-k n 白/黒の閾値(デフォルトは0.5、1ならすべて黒となる)
-W/-H dim 出力画像の幅/高さを指定(「10cm」のように単位*4をつける)
-o file 出力画像のファイル名を指定(デフォルトは元ファイル名.拡張子

上では -W と -H に同じ値(値自体はいくらでも良い)を指定し、正方形に補正している。変換はもっと重い処理かと思っていたが、あっという間に終わってしまった。

変換すると、u3042.svg のようになる。前回述べたように、インデックス BMP 画像では右のようになってしまい、うまくいかない。参考までに、図の4つの画像を置いておく。

(6)へ続く

*1:両者の違いや概要については http://www.antenna.co.jp/ml/References/AboutFonts.htm#o0202 のあたりを参照。

*2:このままだと同じフォルダに混ざるけど(FontForge へのインポートには支障ない)。

*3:初期の仕様では、文字ごとに分割するときに(uXXXXではなく)マスの番号をファイル名にしていた。そして Potrace で変換する際にコードリストを読み込んで uXXXX にしていたので、Perl を使う必要があった。上のスクリプトは、ヒトの盲腸みたいなもんです。

*4:mm, cm, in, pt など(px は不可)、デフォルトはin。