概要
前回は普通のフォント描画系を紹介しましたが、日本語フォントを利用するためには別途efontライブラリが必要でした。最近U8g2ライブラリのフォント形式にも対応し、日本語フォントが内部に組み込まれました。
U8g2ライブラリとは?
モノクロLCD用のライブラリでArduino UNOなどで動く軽量ライブラリです。特徴として、ビルドインのフォントが充実しており、変換ツールなども充実しています。フォントは独自形式で保存されており、プロポーショナルな横幅可変長フォントなどもきれいに表現可能です。データも圧縮されていますので、容量と使い勝手のバランスが取れている感じでした。
U8g2形式の日本語フォントを作ってみた
U8g2ライブラリではefontを収録してありましたが、より大きいフォントがほしかったのでIPAフォントをU8g2フォント形式に変換してみました。
上記が作ったファイルなのですが、LovyanGFXでも動いたので公式に取り込んでもらえました。
収録文字
U8g2ライブラリ標準のjapanese3.mapという文字リストを作って作成しています。
上記に一覧を作成しました。全部で4639文字です。常用漢字+αにしてはちょっと多い感じです。どうやら日本語学習サイトなどの、レベル別漢字一覧から持ってきたリストでちょっと日本人が作成した一覧とは違うところがありますね。ぱっと見、最後に入っている半角カナがありません。
利用フォント
上記のIPAフォントを利用させていただきました。厳密には「IPAexフォントおよびIPAフォント」です。
フォント名 | ファイル名 | 特徴 |
IPAゴシック | ipag.ttf | 全文字固定長 |
IPAexゴシック | ipaexg.ttf | 英数可変長、日本語固定長 |
IPA明朝 | ipam.ttf | 全文字固定長 |
IPAex明朝 | ipaexm.ttf | 英数可変長、日本語固定長 |
特徴として、exとついているフォントは英数が横幅が可変長のプロポーショナルフォントです。日本語部分は無印とexでほとんど変わらないはずです。
フォントサイズ
縦幅 | ゴシック体固定長 | ゴシック体可変長 | 明朝体固定長 | 明朝体可変長 |
8 | 62,262 | 59,515 | 65,108 | 58,391 |
12 | 98,936 | 98,164 | 105,458 | 100,825 |
16 | 145,155 | 146,772 | 152,463 | 148,829 |
20 | 198,329 | 200,111 | 204,826 | 202,252 |
24 | 255,606 | 254,188 | 266,695 | 261,517 |
28 | 308,368 | 310,420 | 316,670 | 310,885 |
32 | 365,149 | 366,760 | 369,462 | 364,164 |
36 | 429,727 | 428,300 | 431,636 | 422,011 |
40 | 490,222 | 491,290 | 500,545 | 492,663 |
フォントは縦幅別に8から4区切りで40までのサイズがあります。実際に描画で利用したフォントのみフラッシュに組み込まれますので、未使用であればファイルサイズは増えません。
逆に、サイズ違いや書体違いのものを複数利用すると、利用したフォント分フラッシュの利用量が増えてしまうので注意してください。
フォント書体の使い分け
おすすめはゴシックの可変長フォントです。明朝もいいのですが、小さい文字だと潰れてしまうので、ゴシックのほうがいいかな。。。
可変長か、固定長かですが英数を混在させる文字を表示させる場合には可変長のほうがきれいに見えると思います。ただし、数値が変化する場合などは固定長じゃないときれいに表示できないので、固定長が必要な場合には、別の英数だけの小さいフォントでの描画がいいと思います。
ゴシックの固定長と可変長の両方を読み込んでも、日本語部分は同じで先頭の英数部分しか差がありませんので、容量が無駄になってしまいます。
出力見本
#include "M5Lite.h" void setup() { M5Lite.begin(); M5Lite.Lcd.clear(); M5Lite.Lcd.setCursor(100,0); M5Lite.Lcd.setFont(&lgfxJapanMincho_24); M5Lite.Lcd.print("lgfxJapanMincho\n"); M5Lite.Lcd.setCursor(0,0); M5Lite.Lcd.setFont(&lgfxJapanMincho_8); M5Lite.Lcd.print("縦 8日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_12); M5Lite.Lcd.print("縦12日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_16); M5Lite.Lcd.print("縦16日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_20); M5Lite.Lcd.print("縦20日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_24); M5Lite.Lcd.print("縦24日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_28); M5Lite.Lcd.print("縦28日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_32); M5Lite.Lcd.print("縦32日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_36); M5Lite.Lcd.print("縦36日本語\n"); M5Lite.Lcd.setFont(&lgfxJapanMincho_40); M5Lite.Lcd.print("縦40日本語\n"); } void loop() { M5Lite.Ex.delay(100); }
こんな感じのスケッチで画面に出力し、M5Liteのスクリーンショットで画像に保存してみました。ちなみにP明朝の全サイズを読み込んでいるので、特殊な設定に変更しアプリサイズを3MBまで拡張しないと実行できません!
lgfxJapanMinchoP

24ドット以上じゃないと明朝はきついかもしれません。できれば32とか大きめを使いたいですね。
lgfxJapanMincho

固定長です。ちなみに上の可変長より固定長の方が横幅が短いですね。iとかはプロポーショナルだと横幅短いですがMとかは広いんですね。
lgfxJapanGothicP

ゴシックです。こちらのほうが安定していますが、16とかだとちょっと潰れてしまいます。16だとefontの方がきれいかもしれません。あっちはビットマップフォントなので、ドットを打ってデザインしているので、文字潰れが少ないです。
lgfxJapanGothic

固定長です。このフォントだけ0に斜め線が入っていますね、、、
複数サイズの使い分け
フォントは等倍で使ったほうがきれいなのですが、フラッシュの容量との兼ね合いがあるので拡大縮小しての描画も可能です。

こんな感じになります。等倍以外は若干画質が落ちますが、複数サイズが容量的に厳しかったらsetTextSize(0.86)みたいに指定して、大きさを変更することが可能です。
→の矢印が収録されていない、、、①とかもないな。この辺は調整して追加したほうがいいかもしれません。。。
フォントの指定方法
フォント名 | 書体 | 縦幅 | フラッシュ容量 |
lgfxJapanMincho_8 | IPA明朝(全文字固定長) | 8 | 65,108 |
lgfxJapanMincho_12 | IPA明朝(全文字固定長) | 12 | 105,458 |
lgfxJapanMincho_16 | IPA明朝(全文字固定長) | 16 | 152,463 |
lgfxJapanMincho_20 | IPA明朝(全文字固定長) | 20 | 204,826 |
lgfxJapanMincho_24 | IPA明朝(全文字固定長) | 24 | 266,695 |
lgfxJapanMincho_28 | IPA明朝(全文字固定長) | 28 | 316,670 |
lgfxJapanMincho_32 | IPA明朝(全文字固定長) | 32 | 369,462 |
lgfxJapanMincho_36 | IPA明朝(全文字固定長) | 36 | 431,636 |
lgfxJapanMincho_40 | IPA明朝(全文字固定長) | 40 | 500,545 |
lgfxJapanMinchoP_8 | IPAex明朝(英数可変長) | 8 | 58,391 |
lgfxJapanMinchoP_12 | IPAex明朝(英数可変長) | 12 | 100,825 |
lgfxJapanMinchoP_16 | IPAex明朝(英数可変長) | 16 | 148,829 |
lgfxJapanMinchoP_20 | IPAex明朝(英数可変長) | 20 | 202,252 |
lgfxJapanMinchoP_24 | IPAex明朝(英数可変長) | 24 | 261,517 |
lgfxJapanMinchoP_28 | IPAex明朝(英数可変長) | 28 | 310,885 |
lgfxJapanMinchoP_32 | IPAex明朝(英数可変長) | 32 | 364,164 |
lgfxJapanMinchoP_36 | IPAex明朝(英数可変長) | 36 | 422,011 |
lgfxJapanMinchoP_40 | IPAex明朝(英数可変長) | 40 | 492,663 |
lgfxJapanGothic_8 | IPAゴシック(全文字固定長) | 8 | 62,262 |
lgfxJapanGothic_12 | IPAゴシック(全文字固定長) | 12 | 98,936 |
lgfxJapanGothic_16 | IPAゴシック(全文字固定長) | 16 | 145,155 |
lgfxJapanGothic_20 | IPAゴシック(全文字固定長) | 20 | 198,329 |
lgfxJapanGothic_24 | IPAゴシック(全文字固定長) | 24 | 255,606 |
lgfxJapanGothic_28 | IPAゴシック(全文字固定長) | 28 | 308,368 |
lgfxJapanGothic_32 | IPAゴシック(全文字固定長) | 32 | 365,149 |
lgfxJapanGothic_36 | IPAゴシック(全文字固定長) | 36 | 429,727 |
lgfxJapanGothic_40 | IPAゴシック(全文字固定長) | 40 | 490,222 |
lgfxJapanGothicP_8 | IPAexゴシック(英数可変長) | 8 | 59,515 |
lgfxJapanGothicP_12 | IPAexゴシック(英数可変長) | 12 | 98,164 |
lgfxJapanGothicP_16 | IPAexゴシック(英数可変長) | 16 | 146,772 |
lgfxJapanGothicP_20 | IPAexゴシック(英数可変長) | 20 | 200,111 |
lgfxJapanGothicP_24 | IPAexゴシック(英数可変長) | 24 | 254,188 |
lgfxJapanGothicP_28 | IPAexゴシック(英数可変長) | 28 | 310,420 |
lgfxJapanGothicP_32 | IPAexゴシック(英数可変長) | 32 | 366,760 |
lgfxJapanGothicP_36 | IPAexゴシック(英数可変長) | 36 | 428,300 |
lgfxJapanGothicP_40 | IPAexゴシック(英数可変長) | 40 | 491,290 |
一番左のフォント名をsetFont(&lgfxJapanMincho_24)みたいに指定します。
まとめ
ビルドインで日本語が使えるのはやっぱり便利ですね。反面小さいサイズはefontの方が品質がいい気がするので、efontもU8g2形式に変換して取り込んでもらったほうがいいのかしら?
あとは、記号とかが文字をもう少し追加したほうが便利な気がする。。。
コメント