TrueTypeフォントからFONTX2形式/BDF形式（など）に変換する

# まえがき

[Rapberry PI Pico(標準SDK/ArduinoSDK) 用　ILI9341 TFT液晶 日本語ライブラリ](https://qiita.com/BUBUBB/items/7c6777c04dedf01d7c3b)や、[Rapberry PI Pico用　ST7735 TFT液晶 SDKライブラリ](https://qiita.com/BUBUBB/items/3caf2aefba4ae3a715e1)などで、日本語のフォントデータを扱うときに、今まではC#で[適当に書きなぐったツール](https://github.com/HisayukiNomura/FontConverter/releases/tag/0.1)を使っていました。

いい加減使いにくくなったので、最近使い始めたPythonで練習がてら書き直しました。練習プログラム以外では、初めて作ったPythonのコードなのでかなり汚いく恥ずかしいのですが、公開しないほうがもっとハズカシイので公開することにしました。

電子工作界隈では、FONTX2は現役なので必要な方は使ってみてください。


1.0 初稿
1.1 BDF形式出力のサポート<br>
新たにBDFフォーマットでのビットマップフォント出力に対応しました。
- コマンドラインオプション -t BDF でBDFファイルを生成可能。
- BDF出力時の分割オプション追加`-bdf-split` オプションを追加し、BDF出力時に半角・全角文字を別ファイルで出力可能。
BDFエンコーディング指定オプション追加
- `-be` または `--bdf-encoding` オプションで、BDF出力時のエンコーディング（SJIS, JIS, UTF8）を選択可能になりました。

これ以下の紹介分は、次のプロンプトを使い、ChatGPTにかいてもらったものをそのまま掲載します。

```
このプロジェクトに関してのqiitaページを書いてください。
readme_ja.mdの内容を包含してください。事務的な記述にして、githubページの解説を含めてください。
```
(事務的な記述にして、はこれがなかったとき、「そんな時使えるのが、XXX！」「みんなも使ってみてくださいね！」など、私の趣味と違う文章になっていたので追加した）

変更履歴

# TrueTypeフォント（TTF）からビットマップフォントデータを生成するPythonユーティリティ

## 概要

本プロジェクトは、TrueType（.ttf）フォントファイルから日本語を含むビットマップフォントデータを生成するPython製ユーティリティです。C言語ヘッダファイル、Pythonソース、バイナリ、FONTX2、BDFなど複数形式での出力に対応しています。

- GitHubリポジトリ: [https://github.com/HisayukiNomura/PyFontConverter](https://github.com/HisayukiNomura/PyFontConverter)

## 特徴

- TrueTypeフォントから日本語を含むビットマップフォントデータを生成
- C言語、Python、バイナリ、FONTX2、BDF形式での出力に対応
- 文字セットやエンコーディング、出力形式を柔軟に指定可能
- コマンドラインから簡単に利用可能

## インストール

必要なパッケージをインストールします。

```sh
pip install -r requirements.txt
```

## 使い方

1. GitHubリポジトリから font.py をダウンロードします。
2. コマンドラインで以下のように実行します。

```sh
python font.py [オプション] フォントファイル(ttf)
```

### 主なオプションとデフォルト値

| オプション | 説明 | デフォルト値 |
|------------|------|-------------|
| `-h, --help` | ヘルプメッセージを表示して終了 | - |
| `-n, --name NAME` | C言語ヘッダファイルで生成される構造体名 | 自動生成 |
| `-s, --size SIZE` | フォントサイズ（全角は正方形、半角は半分の幅） | 12 |
| `-xo, --xoffset XOFFSET` | 文字の水平方向シフト量（ピクセル） | 0 |
| `-yo, --yoffset YOFFSET` | 文字の垂直方向シフト量（ピクセル） | -1 |
| `-cs, --codeset {ALL,LEVEL1,SCHOOL,CUSTOM,TEST}` | 文字セット指定 | ALL |
| `-cf, --charfile CHARFILE` | 文字リストファイル（CUSTOM時必須） | - |
| `-o, --output OUTPUT` | 出力ファイル名 | 自動生成 |
| `-m, --mapping {KANA,NONE}` | 文字グループのマッピング | KANA |
| `-em, --endmark {ALLZERO,ALLMAX,NONE}` | データ末尾の終了マーク | ALLZERO |
| `-t, --outtype {CData,PBinary,Python,FONTX2,BDF}` | 出力フォーマット | CData |
| `-bs, --bdf-split {Default,True,False}` | BDF出力時の分割設定 | Default |
| `-en, --encoding {UTF8,SJIS,JIS}` | 出力ファイルのエンコーディング | -tに従う |
| `-fr, --filereplace` | ファイル名の不適切文字を置換 | - |
| `-v, --verbose` | 詳細なデバッグ情報を表示 | - |
| `-i, --image` | 変換中の文字画像を表示 | - |

### ヘルプ表示

`--help` オプションで使い方が表示されます。システムロケールにより日本語または英語で表示されます。`LANG`環境変数で切り替え可能です。

### 使用例

```sh
python font.py JF-Dot-Shinonome12.ttf -s 12 -cs SCHOOL -o MyFont.h
```
→ 教育漢字のみを含む12x12ドットのC言語ヘッダファイルを出力

```sh
python font.py FONTDATA/ipam.ttf -s 24 -cs ALL -t FONTX2 -o IPAMincho
```
→ 24x24ドットの全角・半角フォントファイルを別々に出力

### 注意事項

- 小さいサイズのビットマップにはドットフォント等の小サイズ向けフォント推奨
- Windows標準のMS明朝等は小サイズ変換に不向き
- 商用利用可能な小サイズ向けフォント例：[http://jikasei.me/font/jf-dotfont/](http://jikasei.me/font/jf-dotfont/)  
  [直接ダウンロード](https://ftp.iij.ad.jp/pub/osdn.jp/users/8/8541/jfdotfont-20150527.7z)

### 出力ファイルについて

- デフォルトはC++ヘッダファイル（.h）
- バイナリやPython形式も出力可能（-tオプション）
- 生成ヘッダファイルはKNJGfx9341プロジェクト等で利用可能

---

※注意：FONTDATAディレクトリに存在する変換後のフォントファイルの権利は、変換元になったフォントの権利に従います。

---

## ライセンス

このプロジェクトはMITライセンスで公開されています。

```
MIT License

Copyright (c) 2025 Hisayuki Nomura

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

---

ご質問や不明点はGitHubリポジトリのIssue等でご連絡ください。