8x8ドットの日本語ビットマップフォント、美咲フォントをPythonで取り扱ってみる。
JIS第一、第二水準をサポートで、ゴシック/明朝のTTF形式とPNG形式がある。
8x8なら、char[8]で格納でき、ダイナミック制御でセレクタを3bitにすることもでき、
データや信号線の取り回しも非常にやりやすい。
こんな素晴らしいものがフリーで公開されているとは!
(公開元のウェブサイト)
TTF形式も公開されているのでfonttoolsを使えば汎用的に扱えるが、
今回使うのは8x8だけなのでコンパクトなPNG形式を対象にした。
misaki_mincho.png ・・・ 54kB
misaki_mincho.ttf ・・・ 1,092kB
約20倍の差がある
このため、png画像から必要な部分を抜き出すことにする。
美咲フォントのpng画像はこんな感じの並び。
(↑PNG版の美咲フォント明朝から一部抜粋)
この並びはShift-JISの2Byte文字部分のよう。
(参考:文字コード表 シフトJIS(Shift_JIS)より)
■Shift-JIS
Shift-JISを構成する範囲は以下の通り。上位1Byte:0x81~0x9F、 0xE0~0xEF
下位1Byte:0x40~0x7E、 0x80~0xFC
字面だけではイメージしづらいので、0xFF×0xFFのドットマトリクスで示す。
何故隙間だらけかというと、ASCIIや他のコードと識別しやすくするためらしい。
特に上位1ByteがASCIIの0x20(半角スペース)や0x41(A), 0x61(a)と同じだと、
日本語なのかASCIIなのか1Byte目だけでは判別できなくなってしまうからだ。
これに対し、PNG画像の並びでいくつか注意が必要な部分がある。
➀開始点のオフセット

(※画像はhttp://charset.7jp.net/様より一部借用)
実際の文字コードは0x8140からスタートする。
それに対し、png画像は最初の8x8が対応するので、このオフセットを考慮しないといけない。
②1Byte目0xA0~0xDFと、2Byte目0x7Fの空白部分

図の通り、Shift-JISの中にはドデカい空白部分がある。
対して、美咲フォントのpng画像は空白部分を詰めている。
③png画像は行数2倍、列数1/2
2つの行頭を見比べると、pngのほうは「ぁァАА・・・亜院押」なのに対し、
Shift-JISの表は「ァА・・・院魁」となっている。
これは、pngのほうが区/点を基準とした表示なのに対し、
Shift-JISの表は16進数基準の表示になっているためである。
つまり、図で示すとおり元々の1行がpng画像では2行分になっている。
これら①②③を考慮すれば、あとは文字コード変換と簡単な画像処理でうまく扱えるはず。
続きは次回。
0 件のコメント:
コメントを投稿