Skip to content

LCD・OLED用フォントデータ作成(ビットマップ→C配列変換)

英数字・かな・漢字のテキストや画像を、SSD1306・SH1106・ST7920・Adafruit GFX向けのC配列に変換。12×12/16×16のドットフォントで線がつぶれず、PCtoLCD2002の4種類の走査方式に対応。出所不明の配列の解析もできます。

トラッキングなし ブラウザで動作 無料
処理はすべてブラウザ内で完結します。文字や画像がこの端末の外に出ることはありません。

SSD1306 / SSD1309 / SH1106 / ST7565のページメモリ、MicroPythonの framebuf.MONO_VLSB と同じ並びです。バイトをそのままディスプレイに書き込めます。

プレビュー

ピクセルをクリックすると点灯/消灯が切り替わります。
    6文字 · 128バイト
    参考:文字「中」(16 × 16)の全走査方向

    点灯ピクセル = 1、GNU Unifontの字形です。手元の配列とバイトを見比べれば、どの設定で作られたかがわかります。

    走査方向 ビット順 バイト(16進数)
    行ごと(横バイト) MSBファースト — 先頭ピクセルをbit 7に 01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00
    行ごと(横バイト) LSBファースト — 先頭ピクセルをbit 0に 80 00 80 00 80 00 80 00 FC 1F 84 10 84 10 84 10 84 10 84 10 FC 1F 84 10 80 00 80 00 80 00 80 00
    列ごと(縦バイト) MSBファースト — 先頭ピクセルをbit 7に 00 00 00 00 0F F0 08 20 08 20 08 20 08 20 FF FF 08 20 08 20 08 20 08 20 0F F0 00 00 00 00 00 00
    列ごと(縦バイト) LSBファースト — 先頭ピクセルをbit 0に 00 00 00 00 F0 0F 10 04 10 04 10 04 10 04 FF FF 10 04 10 04 10 04 10 04 F0 0F 00 00 00 00 00 00
    ページ内の列ごと(縦バイト、SSD1306のページ順) MSBファースト — 先頭ピクセルをbit 7に 00 00 0F 08 08 08 08 FF 08 08 08 08 0F 00 00 00 00 00 F0 20 20 20 20 FF 20 20 20 20 F0 00 00 00
    ページ内の列ごと(縦バイト、SSD1306のページ順) LSBファースト — 先頭ピクセルをbit 0に 00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00
    帯ごとの行(横バイト、幅8ピクセルの帯) MSBファースト — 先頭ピクセルをbit 7に 01 01 01 01 3F 21 21 21 21 21 3F 21 01 01 01 01 00 00 00 00 F8 08 08 08 08 08 F8 08 00 00 00 00
    帯ごとの行(横バイト、幅8ピクセルの帯) LSBファースト — 先頭ピクセルをbit 0に 80 80 80 80 FC 84 84 84 84 84 FC 84 80 80 80 80 00 00 00 00 1F 10 10 10 10 10 1F 10 00 00 00 00

    ドットフォント:GNU Unifont(16 px)とFusion Pixel Font(12 px)。いずれもSIL Open Font License 1.1で提供されています。 ライセンス全文

    走査方向とビット順の8通りの組み合わせすべてを独立した参照実装とバイト単位で照合し、プリセットはSSD1306、SH1106、ST7565のデータシート、およびAdafruit GFX、U8g2、LVGL、MicroPythonのソースコードと突き合わせて確認しています。 — Go Tools エンジニアリングチーム · Oct 3, 2026

    Go Tools エンジニアリングチームが構築し、検証しています。

    早見表

    SSD1306 OLEDに必要な設定は?

    ページ内の列ごと · LSBファースト 表示メモリにバイトを直接書き込む場合は、ページ内の列ごと、LSBファースト、点灯ピクセル = 1です。

    Adafruit GFX drawBitmap() に必要な設定は?

    行ごと · MSBファースト 行ごと、MSBファースト、点灯ピクセル = 1。各行はバイト境界まで埋めます。

    16 × 16の文字は何バイト?

    32バイト どの走査方向でも32バイトです。12 × 12は24バイト、8 × 16のASCII文字は16バイトです。

    PCtoLCD2002の「顺向」「逆向」とは?

    逆向 = LSBファースト 顺向 = MSBファースト(先頭ピクセルがbit 7)、逆向 = LSBファースト(先頭ピクセルがbit 0)です。

    フォントビットマップ(取模)とは?

    SSD1306、SH1106、ST7565をはじめ、グラフィック表示用のOLED/LCDコントローラーの多くはフォントを内蔵していません。文字を表示するには、ファームウェアがオン/オフのピクセルを並べた小さな格子を表示メモリに書き込みます。1ピクセルが1ビット、8ピクセルで1バイトです。字形をこのバイト列に変換する作業は、中国の組み込み系チュートリアルで「取模」と呼ばれ、Windows用ソフトPCtoLCD2002が長年担ってきました。

    ただし、バイト列だけでは足りません。同じ16 × 16の文字でも詰め方は4通り(行ごと、列ごと、ページ内の列ごと、帯ごとの行)あり、それぞれ先頭ピクセルをbit 7に置くかbit 0に置くかを選べます。つまり同じ字形を表すバイト列が8種類でき、ディスプレイが正しく描けるのはそのうち1つだけです。チュートリアルからコピーしたフォントが左右反転したり、上下に割れたり、回転して表示されたりしやすいのはこのためです。

    // 中 (16x16), pages of columns, LSB first, lit = 1 — SSD1306 page order
    const unsigned char zhong[32] = {
      0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,
      0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00
    };
    // First 16 bytes = page 0 (rows 0-7), one byte per column, bit 0 = top row

    このツールでできること

    12 × 12・16 × 16の漢字をドット単位で正確に

    ブラウザのフォントはアンチエイリアス付きのアウトラインです。宋体(明朝系)を12 pxで2値化すると、「中」の横画がそっくり消えてしまいます。そこでこのツールは本物のビットマップフォントを同梱しています。16 × 16フォントはGB2312の6,763字をすべて収録し、12 × 12フォントには143のまれな字が欠けているため、それらはシステムフォントで代わりに描画し、その旨を表示します。

    PCtoLCD2002の4種類の走査方式と両方のビット順

    行ごと、列ごと、ページ内の列ごと、帯ごとの行の4方式に、それぞれMSBファースト/LSBファースト、点灯ピクセル = 1 / 0を組み合わせられます。名称はPCtoLCD2002に合わせ、その意味はSSD1306のデータシートや一般的なOLEDサンプルプロジェクトと照合してあるので、既存プロジェクトと同じ設定をそのまま選べます。

    何に合うかを明示するプリセット

    SSD1306、Adafruit GFX、XBMのいずれかを選べばオプションは自動で設定されます。手動でオプションを変えると、そのバイト順を読むディスプレイとライブラリが表示されます。該当なしの場合もそう表示されます。

    手元の配列を解析

    出所不明のフォント配列を貼り付けると、走査方向とビット順の8通りの読み方がすべて並べて描画されます。正しく読めたものが設定を教えてくれ、ワンクリックでその設定を適用できます。

    本格的なディザリング付きの画像→ビットマップ変換

    ロゴ、アイコン、写真をディスプレイのサイズに合わせて縮小し、しきい値、Floyd–Steinberg、Atkinsonのいずれかで2値化します。透明部分は背景として扱い、しきい値はどのモードでも効きます。

    そのままプロジェクトに組み込める出力

    /*"中",0*/ コメント付きのC51形式2次元配列、オフセット付きのArduino PROGMEM、MicroPythonのbytearray辞書、A51のDB行、プレーンな16進数に対応。生成したCコードは -Wall -Wextra -pedantic でも警告なしでコンパイルできます。

    変換例

    SSD1306 OLED用の「中」(16 × 16、ページ内の列ごと、LSBファースト)

    中
    00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00

    32バイト:ページ0(0〜7行目)の16列分、続いてページ1(8〜15行目)の16列分です。7列目の0xFFは全ビットが1で、縦画が両ページの8行すべてを貫いていることを示します。

    同じ「中」をAdafruit GFX drawBitmap用に(行ごと、MSBファースト)

    中
    01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00

    1行2バイトで16行。0x01 0x00 は中央の縦画だけの行です。左端のピクセルが1バイト目のbit 7なので、7列目のピクセルはbit 0に入ります。このバイト列をSSD1306のページ書き込みに渡すと表示が崩れます。字形は同じでも、詰め方が違うからです。

    16ピクセルフォントの半角A(8 × 16)

    A
    00 00 00 00 18 24 24 42 42 7E 42 42 42 42 00 00

    ASCII文字は半角幅です。8 × 16は16バイトで、行ごとに走査すると1行1バイトになります。ドライバがすべての字形を16 × 16として扱う場合は、「半角文字(A〜Z、0〜9)も全角のセル幅にする」にチェックを入れてください。

    12 × 12が18バイトではなく24バイトになる理由

    中(12 × 12、行ごと、MSBファースト)
    00 00 04 00 04 00 FF E0 84 20 84 20 84 20 FF E0 04 00 04 00 04 00 04 00

    12ピクセルの各行には2バイト必要で、2バイト目の下位4ビットは埋め草です。12行 × 2バイト = 24。表示ライブラリはどれも1行を (width + 7) / 8 バイトとして扱うため、ビットをこれ以上詰めるとすべてのライブラリで読めなくなります。

    LCD・OLED用のフォントデータを作る手順

    1. 1

      文字を入力するか画像をドロップ

      テキストは本物のドットフォントで描画します。12 × 12(Fusion Pixel)または 16 × 16(GNU Unifont)で、ASCIIは半角幅です。ロゴやアイコンは「画像」タブに切り替え、128 × 64 などの出力サイズを指定します。

    2. 2

      表示先のディスプレイ・ライブラリを選ぶ

      SSD1306 / SH1106 / ST7565 は、ページ順の縦バイトで最上段のピクセルがbit 0。Adafruit GFX、TFT_eSPI、U8g2 drawBitmap、LVGL は横バイトで左端のピクセルがbit 7。XBM / U8g2 drawXBM は横バイトで左端のピクセルがbit 0です。

    3. 3

      プレビューを確認し、必要ならドットを修正

      プレビューには、実際にエンコードされるビットマップがそのまま表示されます。ピクセルをクリックすると点灯/消灯が切り替わり、シフト欄で字形の位置を微調整できます。

    4. 4

      コピーまたはダウンロード

      C(PCtoLCD2002のC51形式)、Arduino PROGMEM、MicroPython bytearray、A51アセンブリ、プレーンな16進数から選べます。出力の1行目に走査方向・ビット順・字形サイズが記録されるので、配列そのものが仕様書を兼ねます。

    文字化け:症状 → 間違っている設定

    8ピクセルごとに左右反転する

    横バイトでビット順を間違えています。Adafruit GFXの drawBitmap() はMSBファースト、XBMとU8g2の drawXBM() はLSBファーストが必要です。

    ✗ 誤り
    U8g2 drawXBM() にMSBファーストのバイトを渡す
    ✓ 正しい
    drawXBM() → XBMプリセット(行ごと、LSBファースト)

    8行ごとに上下逆さまになる

    縦バイトでビット順を間違えています。SSD1306系のコントローラはD0を最上段に置くので、LSBファーストが必要です。

    ✗ 誤り
    ページ内の列ごと、MSBファースト → SSD1306
    ✓ 正しい
    ページ内の列ごと、LSBファースト → SSD1306

    上半分と下半分が交互に混ざる

    列ごととページ内の列ごとを取り違えています。両者が同じバイト列になるのは高さ8ピクセル以下の字形だけで、16ピクセルではバイトの並びが変わります。

    ✗ 誤り
    列ごと → SSD1306のページ書き込み
    ✓ 正しい
    ページ内の列ごと → SSD1306のページ書き込み

    対角線で裏返る、または白黒が反転する

    対角線で裏返るのは、横バイトを縦バイトとして(またはその逆に)読んでいるためです。点灯部分が暗く背景が光るなら、ディスプレイが点灯 = 1を想定しているのに点灯 = 0を選んでいます。

    ✗ 誤り
    行ごとのバイトをSSD1306のページに送る
    ✓ 正しい
    配列をデコーダタブに貼り付け、正しく読めるプレビューを選ぶ

    こんなときに使います

    0.96インチSSD1306 OLEDに漢字を表示
    STM32や8051系ボードで、温度表示やメニュー、ステータス行を漢字で出したいとき。16 × 16フォントとSSD1306プリセットを使い、サンプルプロジェクトにある oled_font.h に配列を貼り付けます。
    ArduinoやESP32のディスプレイに起動ロゴ
    PNGのロゴをドロップし、128 × 64に設定してAdafruit GFXプリセットを選び、display.drawBitmap(0, 0, logo, 128, 64, WHITE) を呼び出します。
    LVGLやU8g2のUI用アイコン・単位記号
    電池、Wi-Fi、°Cなどの記号を1ビット画像に。横バイト・MSBファーストならAdafruit GFX / LVGLプリセット、U8g2 drawXBM() ならXBMプリセットを使います。
    MacやLinuxで作業するとき
    PCtoLCD2002や昔ながらの「字模提取」ツールはWindows用です。このツールは最新のブラウザならどれでも動き、インストールも不要です。
    引き継いだプロジェクトの解析
    前任者が残したのは Hzk[][32] 配列だけで、メモはなし。そんなときはデコーダに貼り付けて生成時の設定を割り出し、同じ形式で文字を追加できます。

    4つの走査方向のしくみ

    行ごと(横バイト)
    上の行から順に取り出し、各行の中では左から隣り合う8ピクセルを1バイトに収めます。16ピクセルの行は2バイトです。Adafruit GFXの drawBitmap()、U8g2の drawBitmap()、XBMファイル、ST7920のGDRAM、LVGLの1ビット画像がこの並びです。
    ページ内の列ごと(縦バイト)— SSD1306の並び
    字形を高さ8行の「ページ」に区切り、ページごとに左から列を取り出して、各バイトにその列の8ピクセルを収めます。SSD1306、SH1106、ST7565のGDDRAMと同じ構造で、データシートにはデータビットD0が最上段に書き込まれると明記されています。したがって合わせるビット順はLSBファーストです。
    列ごと、および帯ごとの行
    列ごとは、1列をすべてのページにわたって上から下まで取り出してから右の列へ進みます。SSD1306の垂直アドレッシングモードに対応します。帯ごとの行は、幅8ピクセルの帯について全行を取り出し、次の帯へ進みます。主要なライブラリでは使われませんが、古いPCtoLCD2002のプロジェクトには残っています。どちらも、字形の高さ(または幅)が8ピクセル以下のときだけ相方の方式と同じ結果になるため、8 × 8でテストしていると取り違えに気づきません。
    ビット順と点灯ピクセルの値
    MSBファーストは最初に取り出したピクセル(左端または最上段)をbit 7に、LSBファーストはbit 0に置きます。PCtoLCD2002ではそれぞれ「顺向」(順方向=MSBファースト)、「逆向」(逆方向=LSBファースト)と表記されています。点灯 = 1(「阴码」)はOLED、TFTの drawBitmap()、LVGLのA1形式が前提とする値で、点灯 = 0(「阳码」)は0を点灯と定義するドライバ専用です。
    サイズが8の倍数でないときの埋め草
    行(横バイト)またはページ(縦バイト)ごとに、それぞれ単独でバイト境界まで埋め、埋め草のビットは0になります。ページ内の列ごとで12ピクセルの字形なら、2ページ目に4行分の埋め草が入ります。ページ単位で書き込むドライバは、字形の下の4行を消してしまいます。該当する場合はツールが警告を出します。

    一度で正しく表示させるコツ

    プリセットは画面ではなく描画関数で選ぶ
    Adafruit_SSD1306で駆動するSSD1306は drawBitmap() を経由するため、コントローラ自体のメモリが縦方向でも、横バイト・MSBファーストのデータが必要です。コードが呼び出している関数に合うプリセットを選んでください。
    12 pxと16 pxにはドットフォントを
    アウトラインフォントは約20 px未満で2値化すると線が欠けます。Fusion Pixel 12とUnifont 16はピクセルグリッド上でデザインされており、2倍オプションを使えば24 × 24と32 × 32もきれいに出せます。
    ヘッダーコメントは消さない
    出力の1行目には走査方向・ビット順・サイズが記録されています。半年後、その配列がどう作られたかを示す唯一の記録になります。
    左右非対称の文字で試す
    「中」「田」「H」のような対称な字形では反転ミスに気づけません。まず F、7、乙 で試し、正しく読めればすべてのオプションが合っています。
    画面全体の反転はドライバ側で直す
    フォントだけでなく画面全体が左右反転・上下逆さまになっているなら、初期化シーケンスのセグメントリマップ(A0h/A1h)とCOMスキャン方向(C0h/C8h)を変更します。フォント設定を変えても、ほかのコードが崩れるだけです。

    よくある質問

    SSD1306やSH1106のOLEDにはどの設定を使えばいいですか?
    フォントのバイトをディスプレイに直接書き込むコード(8051系やSTM32のサンプルの大半)なら、ページ内の列ごと、LSBファースト、点灯 = 1、つまりSSD1306プリセットです。Adafruit_SSD1306やU8g2の drawBitmap() で描画する場合は、Adafruit GFXプリセットを使ってください。これらの関数は横バイト・MSBファーストのデータを読み、内部で変換するからです。
    文字が反転したり、逆さまになったり、崩れたりします。何が原因ですか?
    症状ごとに原因となる設定は1つです。8ピクセルごとに左右反転:横バイトでビット順の誤り。8行ごとに上下逆さま:縦バイトでビット順の誤り。上半分と下半分が交互に混ざる:列ごととページ内の列ごとの取り違え。対角線で裏返る:横バイトと縦バイトの取り違え。白黒反転:点灯 = 1と点灯 = 0の取り違え。文字だけでなく画面全体が反転している場合は、ドライバの初期化シーケンスを直してください。
    12 × 12が18バイトではなく24バイトになるのはなぜですか?
    各行(または8行単位の各ページ)が、それぞれ単独でバイト境界まで埋められるからです。12ピクセルには2バイト必要で、12行 × 2 = 24になります。表示ライブラリは1行を (width + 7) / 8 バイトとして扱うので、ぎっしり詰めた18バイトの字形はどのライブラリでも正しく読めません。
    12ピクセルの文字を描くと、OLEDの下の行が消えてしまうのはなぜですか?
    ページ内の列ごとでは、12ピクセルの字形が1ページ全体と次のページの半分を占め、2ページ目の残り4ビットは0の埋め草になります。ページ単位で書き込むドライバは、その4行を消してしまいます。ピクセル単位で設定するフレームバッファ経由で描画するか、空の行がほかの表示と重ならない位置に12ピクセルの文字を置いてください。
    MacでPCtoLCD2002の代わりに使えますか?
    はい。最新のブラウザならどれでも動き、同じ4種類の走査方式、両方のビット順、点灯 = 1 / 点灯 = 0に対応しています。C出力はPCtoLCD2002のC51形式に沿った /*"字",0*/ コメント付きなので、Hzk[][32] 形式の配列を前提にしたプロジェクトにそのまま貼り付けられます。ただし、フォントライブラリファイル一式やインデックスの生成はできません。字形はWindowsのSimSun(宋体)ではなくGNU UnifontとFusion Pixelに基づくため、PCtoLCD2002で作った配列とはバイト単位で一致しません。両者を混在させず、表全体をここで作り直してください。本サイトはPCtoLCD2002およびその作者とは無関係で、公式のWeb版ではなく、同ソフトのダウンロードも提供していません。
    システムフォントではなくドットフォントを使うのはなぜですか?
    システムフォントはアンチエイリアス付きで描画されるアウトラインで、ブラウザではアンチエイリアスを無効にできません。12や16ピクセルでは、そのグレーの縁を2値化すると細い線が消えます。12ピクセルの宋体(明朝系)では「中」の横画がまるごと消えるほどです。GNU Unifont(16 px)とFusion Pixel(12 px)はピクセルグリッド上でデザインされているので、何も欠けません。より大きいサイズではシステムフォントも使えます。黒体(ゴシック系)なら約24 pxから実用になりますが、宋体(明朝系)はそのサイズでも線が欠けることがあります。
    ドットフォントはどの文字をカバーしていますか?
    GB2312の全字(簡体字6,763字と全角句読点)、印字可能なASCII、アクセント付きラテン文字(é、ß、ł、ş、ő)、ギリシャ文字、キリル文字、ひらがな・カタカナ、それに℃、矢印、罫線などのよく使う記号です。Fusion Pixelの12 pxには一部の珍しい文字や記号がありません。ハングルと、GB2312に含まれない漢字(繁体字や日本独自の字形の多く)は代わりにシステムフォントで描画され、プレビューの下に一覧表示されるので、どの字形を確認すべきかがわかります。
    ロゴやアイコンをC配列に変換するには?
    「画像」タブを開いてファイルをドロップし、ディスプレイのサイズ(0.96インチOLEDなら128 × 64)を指定して、「枠内に収める(縦横比を維持)」のままにします。暗いピクセルが点灯ピクセルになります。暗い背景に明るい図柄の場合は反転にチェックを入れてください。ロゴや文字はディザリングなし、写真にはFloyd–SteinbergかAtkinsonを使います。
    既存のフォント配列がどう生成されたかを調べるには?
    「既存の配列をプレビュー」タブに貼り付けます。コメントは無視され、C、Arduino、A51、MicroPythonのどの書式も受け付けます。バイト数から字形サイズを推定し、走査方向とビット順の8通りの組み合わせをすべて描画します。正しく読めたものがその設定で、「この設定を使う」を押すとジェネレータに反映されます。
    入力した文字や画像はアップロードされますか?
    いいえ。字形の描画とエンコードはブラウザ内で行います。ドットフォントはこのサイトから一度ダウンロードされるだけで、入力した文字やドロップした画像がどこかに送信されることはありません。

    進数変換ツール — 2進数・16進数・10進数・8進数

    単位変換

    無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。

    2の補数計算機 — 符号付き整数エンコーディング変換

    単位変換

    符号付き10進数を入力すると、符号絶対値表現・1の補数・2の補数・ゲタばき表現を4〜64ビットで同時に算出します。ビット列や16進バイトを貼り付ければ、同じパターンの5通りの読み方を並べて確認できます。8ビットの−128に符号絶対値表現と1の補数が存在しないことも明示。すべてブラウザ内で処理、無料、登録不要。

    chmod 計算ツール — Linux ファイル権限

    単位変換

    Linux のファイル権限(パーミッション)を8進数(755・644)と rwx 記号で相互変換する無料計算ツール。chmod コマンドを自動生成し、chmod 755 の意味や 777 の危険な設定もひと目で確認。すべてブラウザ内で完結します。

    カラーコンバーター — HEX, RGB, HSL & OKLCH

    単位変換

    HEX を RGB、HSL、OKLCH、OKLAB、CMYK にブラウザで変換できます。任意の形式をワンクリックでコピー。無料・登録不要・色データはページから一切送信されません。

    座標変換ツール:緯度経度・度分秒・UTM・GCJ-02

    単位変換

    緯度経度を10進数・度分秒(DMS)・度分(DDM)のどの形式でも、UTM、Web メルカトル、中国の GCJ-02(高徳地図)・BD-09(百度地図)へ変換。lat,lng と lng,lat を自動判別し、GCJ-02 の逆変換は誤差 1 mm 未満、CSV で一括出力。処理はすべてブラウザ内で完結します。

    HEX から CMYK へのコンバーター

    単位変換

    HEX カラーを CMYK にブラウザで変換できます。印刷プレビュー向けの sRGB ベースの単純な近似値です。無料・登録不要、色データはローカルから出ません。