てきとうに書いて作ったフォントができるまで(5)
てきとうに書いて作ったフォントについて、(1), (2), (3), (4) の続き。
Potrace で SVG に変換
動画中でも触れたとおり、文字ごとに切り分けただけでは画像はラスタイメージのままである。今回作ろうとしているのものは、ビットマップフォントではなくアウトラインフォント*1なので、ここから画像をベクタイメージに変換する必要がある。アウトラインを手作業でトレースしていたら日が暮れてしまうので、ここでは Potrace というツールで一気に変換する。
- Peter Selinger: Potrace(本家)
- Potraceでラスタ画像をベクタ画像に変換 | faLog(使い方紹介、オプションの和訳)
- 作業メモとか考えた事とか (2003年8月)(狩野さんによるアルゴリズム簡説)
動画の中ではこんな感じで 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つの画像を置いておく。
関連記事
*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。