2020年2月16日日曜日

美咲フォント(misaki font)をPythonで扱う<事前検討>

(実装だけが必要の場合、こちらのページへGo!

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 件のコメント:

コメントを投稿