Skip to content

Генератор шрифтов для LCD и OLED: растр в массив C

Превращает китайский или английский текст и изображения в массивы C для SSD1306, SH1106, ST7920 и Adafruit GFX. Чёткие пиксельные шрифты 12×12 и 16×16, все четыре режима сканирования PCtoLCD2002 и декодер неизвестных массивов.

Без отслеживания Работает в браузере Бесплатно
Всё работает в Вашем браузере — текст и изображения не покидают это устройство.

Соответствует страничной памяти SSD1306 / SSD1309 / SH1106 / ST7565 и MicroPython framebuf.MONO_VLSB — байты можно писать прямо в дисплей.

Превью

Щёлкните по пикселю, чтобы переключить его.
    Глифов: 6 · байт: 96
    Справка: символ 中 (16 × 16) во всех направлениях сканирования

    Включённый пиксель = 1, глиф GNU Unifont. Сравните эти байты со своим массивом, чтобы понять, с какими настройками он сделан.

    Направление сканирования Порядок битов Байты (HEX)
    Построчно (горизонтальные байты) MSB первым — первый пиксель в бите 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 первым — первый пиксель в бите 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 первым — первый пиксель в бите 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 первым — первый пиксель в бите 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 первым — первый пиксель в бите 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 первым — первый пиксель в бите 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 первым — первый пиксель в бите 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 первым — первый пиксель в бите 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. Тексты лицензий

    Все восемь сочетаний направления сканирования и порядка битов побайтно сверяются с независимой эталонной реализацией, а пресеты — с даташитами SSD1306, SH1106 и ST7565 и исходным кодом Adafruit GFX, U8g2, LVGL и MicroPython. — Инженерная команда Go-Tools · Oct 3, 2026

    Создано и проверено инженерной командой Go Tools.

    Быстрые ответы

    Какие настройки нужны для OLED SSD1306?

    Столбцы по страницам · LSB первым Столбцы по страницам, LSB первым, включённый пиксель = 1 — если байты пишутся прямо в видеопамять дисплея.

    Какие настройки нужны для Adafruit GFX drawBitmap()?

    Построчно · MSB первым Построчно, MSB первым, включённый пиксель = 1, каждая строка дополнена до целых байтов.

    Сколько байтов занимает символ 16 × 16?

    32 байта 32 байта при любом направлении сканирования. 12 × 12 — 24 байта, ASCII-символ 8 × 16 — 16 байт.

    Что означают 顺向 и 逆向 в PCtoLCD2002?

    逆向 = LSB первым 顺向 = MSB первым (первый пиксель в бите 7); 逆向 = LSB первым (первый пиксель в бите 0).

    Что такое растровый шрифт (матрица символа)?

    У большинства графических контроллеров OLED и LCD — в том числе SSD1306, SH1106 и ST7565 — нет встроенного шрифта. Чтобы вывести символ, прошивка копирует в видеопамять небольшую сетку включённых и выключенных пикселей — по биту на пиксель, по восемь пикселей в байте. Превращение глифа в эти байты называют генерацией матрицы символа (в китайских руководствах по встраиваемым системам — 取模); именно этим много лет занимается Windows-программа PCtoLCD2002.

    Но одних байтов мало. Один и тот же символ 16 × 16 можно упаковать четырьмя способами (построчно, по столбцам, столбцами по страницам, строками по полосам), и в каждом первый пиксель может оказаться в бите 7 или в бите 0. Восемь разных потоков байтов описывают один и тот же глиф, а дисплей правильно нарисует только один из них. Поэтому шрифт, скопированный из чужого урока, так часто выходит зеркальным, разрезанным пополам или повёрнутым.

    // 中 (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 в гарнитуре Song горизонтальные черты 中 просто исчезают. Поэтому здесь используются настоящие растровые шрифты: шрифт 16 × 16 покрывает все 6 763 иероглифа GB2312, а в шрифте 12 × 12 нет 143 редких знаков — они рисуются системным шрифтом и помечаются.

    Все четыре режима сканирования PCtoLCD2002 и оба порядка битов

    Построчно, по столбцам, столбцы по страницам и строки по полосам — каждый с MSB первым или LSB первым, включённый пиксель = 1 или 0. Названия опций взяты из PCtoLCD2002, а их смысл сверен с даташитом SSD1306 и распространёнными примерами проектов для OLED, так что можно выбрать те же настройки, что и в существующем проекте.

    Пресеты, которые говорят, чему соответствуют

    Выберите SSD1306, Adafruit GFX или XBM — и настройки выставятся сами. Измените любую вручную, и инструмент подскажет, какие дисплеи и библиотеки читают такой порядок байтов, — или что не читает ни одна.

    Расшифровка уже имеющегося массива

    Вставьте массив шрифта неизвестного происхождения — все восемь вариантов прочтения (направление сканирования × порядок битов) будут нарисованы рядом. Читаемый вариант подскажет настройки, а один щелчок их применит.

    Изображение в растр с настоящим dithering

    Логотипы, иконки и фотографии масштабируются под размер дисплея и переводятся в 1 бит по порогу или с dithering по Floyd–Steinberg или Atkinson. Прозрачные области считаются фоном, а порог работает в любом режиме.

    Вывод, который сразу встаёт в проект

    Двумерные массивы в стиле C51 с комментариями /*"中",0*/, Arduino PROGMEM со смещениями, словари MicroPython bytearray, строки DB для A51 или просто HEX. Сгенерированный код на C компилируется без предупреждений с -Wall -Wextra -pedantic.

    Разобранные примеры

    中 для OLED SSD1306 (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 байта: 16 столбцов страницы 0 (строки 0–7), затем 16 столбцов страницы 1 (строки 8–15). В байте 0xFF в столбце 7 установлены все биты: вертикальная черта проходит через все восемь строк обеих страниц.

    Тот же 中 для 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

    По два байта на строку, 16 строк. 0x01 0x00 — это одна центральная черта: крайний левый пиксель — бит 7 первого байта, поэтому пиксель в столбце 7 попадает в бит 0. Отправьте эти байты постраничной записью в SSD1306 — получите мусор: глиф тот же, упаковка другая.

    Полуширинная A в 16-пиксельном шрифте (8 × 16)

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

    Символы ASCII — половинной ширины: 8 × 16 — это 16 байт, по одному байту на строку при построчном сканировании. Отметьте «Растянуть полуширинные символы на всю ширину ячейки», если драйвер ожидает, что каждый глиф будет 16 × 16.

    Почему 12 × 12 — это 24 байта, а не 18

    中 (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-пиксельной строке нужно два байта; последние четыре бита второго байта — дополнение. 12 строк × 2 байта = 24. Все библиотеки дисплеев адресуют строку как (ширина + 7) / 8 байт, так что более плотная упаковка битов сломала бы их все.

    Как сгенерировать данные шрифта для LCD или OLED

    1. 1

      Введите текст или перетащите изображение

      Текст рисуется настоящим пиксельным шрифтом: 12 × 12 (Fusion Pixel) или 16 × 16 (GNU Unifont), символы ASCII — половинной ширины. Для логотипов и иконок переключитесь на вкладку «Изображение» и задайте целевой размер, например 128 × 64.

    2. 2

      Выберите целевой дисплей или библиотеку

      Для SSD1306 / SH1106 / ST7565 нужны вертикальные байты в порядке страниц, верхний пиксель — в бите 0. Для Adafruit GFX, TFT_eSPI, U8g2 drawBitmap и LVGL нужны горизонтальные байты, левый пиксель — в бите 7. XBM / U8g2 drawXBM — то же самое, но левый пиксель в бите 0.

    3. 3

      Проверьте превью и при необходимости поправьте пиксели

      Превью показывает ровно тот растр, который кодируется. Щёлкните по любому пикселю, чтобы переключить его, или сдвиньте глиф полями смещения.

    4. 4

      Скопируйте или скачайте

      Выберите C (стиль C51 из PCtoLCD2002), Arduino PROGMEM, MicroPython bytearray, ассемблер A51 или просто HEX. Первая строка вывода фиксирует направление сканирования, порядок битов и размер глифа, так что массив документирует сам себя.

    Искажённые символы: симптом → неверная настройка

    Каждая группа из 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

    Глиф отражён по диагонали или инвертирован

    Отражение по диагонали означает, что горизонтальные байты прочитаны как вертикальные (или наоборот). Тёмный текст на светящемся фоне — значит, выбран включённый пиксель = 0 там, где дисплей ожидает включённый пиксель = 1.

    ✗ Неверно
    Построчные байты отправлены в страницу SSD1306
    ✓ Верно
    Вставьте массив на вкладку «Превью готового массива» и выберите читаемый вариант

    Когда это нужно

    Китайский текст на OLED SSD1306 0,96"
    Температура, меню или строка состояния на китайском на плате STM32 или 51. Возьмите шрифт 16 × 16 с пресетом SSD1306 и вставьте массив в oled_font.h, который уже есть в вашем примере проекта.
    Загрузочный логотип на дисплее Arduino или ESP32
    Перетащите логотип в PNG, задайте 128 × 64, выберите пресет Adafruit GFX и вызовите display.drawBitmap(0, 0, logo, 128, 64, WHITE).
    Иконки и единицы измерения для интерфейса на LVGL или U8g2
    Значки батареи, Wi-Fi и °C как 1-битные изображения. Для горизонтальных байтов с MSB первым используйте пресет Adafruit GFX / LVGL, для U8g2 drawXBM() — пресет XBM.
    Работа на Mac или Linux
    PCtoLCD2002 и классические программы 字模提取 — это приложения для Windows. Этот инструмент работает в любом современном браузере и не требует установки.
    Разбор унаследованного проекта
    Предыдущий разработчик оставил массив Hzk[][32] и ни одной заметки. Вставьте его в декодер, чтобы узнать, как он был сгенерирован, прежде чем добавлять новые символы в том же формате.

    Как работают четыре направления сканирования

    Построчно (горизонтальные байты)
    Строки берутся сверху вниз; внутри строки каждый байт содержит восемь соседних пикселей слева направо. 16-пиксельная строка — это два байта. Такую раскладку используют drawBitmap() в Adafruit GFX, drawBitmap() в U8g2, файлы XBM, GDRAM контроллера ST7920 и 1-битные изображения LVGL.
    Столбцы по страницам (вертикальные байты) — порядок SSD1306
    Глиф режется на страницы высотой восемь строк. В каждой странице столбцы берутся слева направо, и каждый байт содержит восемь пикселей своего столбца. Это совпадает с GDDRAM контроллеров SSD1306, SH1106 и ST7565: в даташите сказано, что бит данных D0 записывается в верхнюю строку, — значит, подходящий порядок битов — LSB первым.
    По столбцам и строки по полосам
    Режим «по столбцам» проходит каждый столбец сверху вниз через все страницы и только потом сдвигается вправо; он соответствует вертикальному режиму адресации SSD1306. Режим «строки по полосам» берёт полосу шириной 8 пикселей, все её строки, затем следующую полосу; ни одна распространённая библиотека его не использует, но старые проекты на PCtoLCD2002 — используют. Каждый из них совпадает со своим «соседом», только когда глиф не выше (или не шире) 8 пикселей, — поэтому на тестах 8 × 8 путаница остаётся незамеченной.
    Порядок битов и значение включённого пикселя
    MSB первым помещает первый взятый пиксель (крайний левый или верхний) в бит 7; LSB первым — в бит 0. В PCtoLCD2002 они называются 顺向 (прямой порядок, MSB первым) и 逆向 (обратный порядок, LSB первым). Включённый пиксель = 1 (阴码) ожидают OLED-дисплеи, TFT drawBitmap() и LVGL A1; включённый пиксель = 0 (阳码) нужен только драйверам, у которых 0 означает «горит».
    Дополнение, когда размер не кратен 8
    Каждая строка (горизонтальные байты) или каждая страница (вертикальные байты) дополняется до целых байтов отдельно, дополняющие биты равны 0. В режиме «столбцы по страницам» у 12-пиксельного глифа вторая страница несёт 4 строки дополнения; драйвер, записывающий страницы целиком, стирает эти 4 строки под глифом. Инструмент предупреждает, когда это происходит.

    Как сделать правильно с первого раза

    Выбирайте пресет по функции рисования, а не по экрану
    SSD1306 под управлением Adafruit_SSD1306 работает через drawBitmap(), поэтому ему нужны горизонтальные байты с MSB первым, хотя собственная память контроллера вертикальная. Выбирайте пресет под функцию, которую вызывает ваш код.
    Для 12 и 16 px берите пиксельные шрифты
    Контурные шрифты меньше примерно 20 px при пороговом преобразовании теряют черты. Fusion Pixel 12 и Unifont 16 нарисованы по пиксельной сетке, а варианты с масштабом 2× дают чистые 24 × 24 и 32 × 32.
    Не удаляйте комментарий в первой строке
    Первая строка вывода фиксирует направление сканирования, порядок битов и размер. Через полгода это будет единственная запись о том, как был получен массив.
    Проверяйте на несимметричном символе
    Симметричные глифы вроде 中, 田 или H скрывают ошибки отражения. Сначала попробуйте F, 7 или 乙: если они читаются правильно, все настройки верны.
    Зеркалирование всего экрана исправляйте в драйвере
    Если зеркально или вверх ногами отображается всё на экране, а не только ваш шрифт, поменяйте переназначение сегментов (A0h/A1h) и направление сканирования COM (C0h/C8h) в последовательности инициализации. Изменение настроек шрифта только сломает другой код.

    Часто задаваемые вопросы

    Какие настройки выбрать для OLED SSD1306 или SH1106?
    Если код пишет байты шрифта прямо в дисплей (так делает большинство примеров для 51 и STM32): столбцы по страницам, LSB первым, включённый пиксель = 1 — это пресет SSD1306. Если вывод идёт через Adafruit_SSD1306 или U8g2 drawBitmap(), выберите пресет Adafruit GFX: эти функции читают горизонтальные байты с MSB первым и сами их преобразуют.
    Символы выводятся зеркально, вверх ногами или кашей. Что не так?
    Каждый симптом указывает на одну настройку. Каждые 8 пикселей отражены слева направо — неверный порядок битов при горизонтальных байтах. Каждые 8 строк перевёрнуты — неверный порядок битов при вертикальных байтах. Верхняя и нижняя половины перемешаны — перепутаны «по столбцам» и «столбцы по страницам». Отражение по диагонали — перепутаны горизонтальные и вертикальные байты. Инвертированные цвета — перепутаны включённый пиксель = 1 и включённый пиксель = 0. Если зеркально отображается весь экран, а не только текст, исправляйте последовательность инициализации в драйвере.
    Почему 12 × 12 занимает 24 байта, а не 18?
    Каждая строка (или каждая страница из 8 строк) дополняется до целых байтов отдельно: 12 пикселям нужно 2 байта, и 12 строк × 2 = 24. Библиотеки дисплеев адресуют строку как (ширина + 7) / 8 байт, поэтому плотно упакованный 18-байтовый глиф все они прочитали бы неправильно.
    Почему 12-пиксельный текст на OLED стирает строку под собой?
    В режиме «столбцы по страницам» 12-пиксельный глиф занимает одну страницу целиком и половину следующей; остальные 4 бита второй страницы — нулевое дополнение. Драйвер, записывающий страницы целиком, стирает эти 4 строки. Рисуйте через кадровый буфер, который ставит пиксели по отдельности, или размещайте 12-пиксельный текст так, чтобы пустые строки приходились туда, где больше ничего не рисуется.
    Можно ли пользоваться этим вместо PCtoLCD2002 на Mac?
    Да. Инструмент работает в любом современном браузере, поддерживает те же четыре режима сканирования, оба порядка битов и включённый пиксель = 1 / = 0, а вывод на C повторяет стиль C51 из PCtoLCD2002 с комментариями /*"字",0*/, поэтому вставляется в проекты, построенные вокруг массивов вида Hzk[][32]. Полные файлы шрифтовых библиотек и индексы он не генерирует. Начертания глифов взяты из GNU Unifont и Fusion Pixel, а не из SimSun в Windows, поэтому массив не совпадёт побайтно с созданным в PCtoLCD2002 — сгенерируйте здесь всю таблицу заново, а не смешивайте одно с другим. Сайт не связан с PCtoLCD2002 и его автором, не является официальной веб-версией и не предлагает скачать программу.
    Зачем пиксельный шрифт, если есть системный?
    Системные шрифты — контурные, рисуются со сглаживанием, и отключить его в браузере нельзя. На 12 или 16 пикселях пороговое преобразование серой кромки съедает тонкие черты — в 12-пиксельной гарнитуре Song горизонтальные черты 中 пропадают полностью. GNU Unifont (16 px) и Fusion Pixel (12 px) нарисованы по пиксельной сетке, поэтому ничего не теряется. Для более крупных размеров системные шрифты по-прежнему доступны: рубленая гарнитура (Hei) держится примерно с 24 px, а гарнитуры Song на этом размере ещё могут терять черты.
    Какие символы есть в пиксельных шрифтах?
    Весь GB2312 — 6 763 упрощённых китайских иероглифа плюс полноширинная пунктуация, — а также печатные символы ASCII, латиница с диакритикой (é, ß, ł, ş, ő), греческий алфавит, кириллица, японская кана и распространённые знаки вроде ℃, стрелок и псевдографики. В Fusion Pixel 12 px нет некоторых редких символов и знаков. Корейский хангыль и иероглифы вне GB2312 (традиционные формы, многие японские кандзи) рисуются системным шрифтом и перечисляются под превью, чтобы было видно, какие глифы проверить.
    Как перевести логотип или иконку в массив C?
    Откройте вкладку «Изображение», перетащите файл, задайте размер дисплея (128 × 64 для OLED 0,96") и оставьте «Вписать с сохранением пропорций». Тёмные пиксели становятся включёнными; для светлой графики на тёмном фоне отметьте инверсию. Для логотипов и текста dithering не нужен, для фотографий — Floyd–Steinberg или Atkinson.
    Как узнать, как был сгенерирован имеющийся массив шрифта?
    Вставьте его на вкладку «Превью готового массива». Комментарии игнорируются, принимается синтаксис C, Arduino, A51 и MicroPython. Размер глифа угадывается по числу байтов, и рисуются все восемь сочетаний направления сканирования и порядка битов. Сочетание, которое читается правильно, и есть ваша настройка, а кнопка «Применить эти настройки» переносит его в генератор.
    Загружаются ли мой текст или изображение на сервер?
    Нет. Глифы рендерятся и кодируются в браузере. Пиксельные шрифты один раз скачиваются с этого сайта, а всё, что вы вводите или перетаскиваете, никуда не отправляется.

    Похожие инструменты

    Все инструменты →

    Конвертер систем счисления — bin, hex, dec, oct

    Конвертеры

    Конвертация между системами счисления — двоичной, hex, десятичной, восьмеричной и любой базой 2-36 мгновенно. Бесплатно, приватно — вся обработка в браузере.

    Калькулятор дополнительного кода и знаковых представлений

    Конвертеры

    Введите знаковое целое и получите прямой, обратный, дополнительный и смещённый код сразу, от 4 до 64 бит. Или вставьте битовый паттерн либо hex-байт и увидите все пять прочтений рядом. Локально и бесплатно.

    Калькулятор chmod — права доступа к файлам Linux

    Конвертеры

    Конвертация прав доступа Linux между восьмеричной записью (755, 644) и символами rwx. Готовые команды chmod и предупреждения о рискованных режимах вроде 777 — бесплатно, прямо в вашем браузере.

    Конвертер цветов — HEX, RGB, HSL и OKLCH

    Конвертеры

    Конвертируйте HEX в RGB, HSL, OKLCH, OKLAB и CMYK прямо в браузере — копируйте любой формат в один клик. Бесплатно, без регистрации, ваши цвета никогда не покидают страницу.

    Конвертер координат: широта/долгота, DMS, UTM, GCJ-02

    Конвертеры

    Перевод координат из любого формата — десятичные градусы, градусы минуты секунды, DDM — в UTM, Web Mercator и китайские GCJ-02 (AMap) и BD-09 (Baidu). Определяет порядок lat,lng/lng,lat, пакетно выгружает CSV. Работает в браузере.

    Конвертер HEX в CMYK

    Конвертеры

    Конвертируйте HEX-цвета в CMYK прямо в браузере. Наивное приближение на основе sRGB для предпросмотра печати. Бесплатно, без регистрации, ваши цвета остаются локально.