Заголовочный файл C с растровыми шрифтами

Мне нужно сделать некоторый элементарный рендеринг текста в пиксельный буфер, и я думаю, что иметь таблицу, индексированную char с представлением букв в виде двоичного массива, было бы более чем достаточно... Кто-нибудь знает о свободном заголовке как таковом?

Пример:

char data[256][8][8];
void init()
{
  data['a'] = {
    {0,0,1,1,1,0,0,0},
    {0,1,0,0,0,1,0,0},
    {0,0,0,0,0,0,1,0},
    {0,0,1,1,1,0,1,0},
    {0,1,0,0,0,1,1,0},
    {0,1,0,0,0,0,1,0},
    {0,1,0,0,0,1,1,0},
    {0,0,1,1,1,0,1,0},
  };
}

Я мог бы продолжить с остальной частью алфавита, но тогда мне не нужно было бы спрашивать... ¡Но это дает мне идею! если нет свободного заголовка с готовым растровым шрифтом, каждый ответ мог бы реализовать букву, и я мог бы собрать весь файл здесь ^_^


person fortran    schedule 28.01.2010    source источник
comment
Я бы сохранил 1 бит на пиксель вместо 1 байта на пиксель ... тем более, что ваша целевая ширина шрифта кажется равной 8.   -  person R.. GitHub STOP HELPING ICE    schedule 07.07.2010


Ответы (7)


Обновление: я попробовал этот подход, и символы получились довольно искаженными. Возможно, Nimbus — плохой выбор шрифта.

Используйте подход imagemagick. Вы можете сгенерировать каждый символ с помощью этого:

convert -resize 7x13\! -font Nimbus-Mono-Regular -pointsize 10 label:A A.xbm

A.xbm выглядит так:

#define A_width 7
#define A_height 13
static char A_bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x1C, 0x08, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x00,
  0x00, };

Прокрутите нужные символы и соберите их в один заголовочный файл.

Несмотря на то, что Nimbus-Mono-Regular является моноширинным шрифтом, иногда ширина символов отличается на пиксель. Опция преобразования "-resize 7x13!" форсирует выходной размер 7x13. Опять же, это может быть проблемой именно со шрифтом Nimbus.

person dkantowitz    schedule 28.01.2010
comment
Извините, что выкопал этот старый пост, но можно ли как-нибудь сделать весь шрифт? - person PQCraft; 25.05.2021
comment
Попробуйте что-то вроде: for c in {a..z} {A..Z} {0..9}; сделать конвертировать - изменить размер 7x13\! -шрифт Nimbus-Mono-Regular -размер 10 пунктов метка:$c xbm:- ›› font.xbm; Выполнено - person dkantowitz; 26.05.2021

В итоге я использовал: https://github.com/dhepper/font8x8

Монохромный растровый шрифт 8x8.

Лицензия: общественное достояние

void render(char *bitmap) {
    int x,y;
    int set;
    for (x=0; x < 8; x++) {
        for (y=0; y < 8; y++) {
            set = bitmap[x] & 1 << y;
            printf("%c", set ? 'X' : ' ');
        }
        printf("\n");
    }
}

render(font8x8_basic['A']);

Отпечатки:

  XX    
 XXXX   
XX  XX  
XX  XX  
XXXXXX  
XX  XX  
XX  XX
person madeso    schedule 03.08.2017
comment
Я успешно использовал его с 3,5-дюймовым ЖК-дисплеем TFT с Arduino Uno. - person Richard Chambers; 08.05.2021
comment
есть ли способ использовать эти 8x8, но рисовать их как 16x16 (удвоение разрешения)? - person navy1978; 28.07.2021

Я знаю, что вы можете сохранять изображения в виде файла заголовка c в gimp. Возможно, вы сможете найти инструмент, который выполняет эту работу в командной строке. Таким образом, вы можете автоматизировать создание. ImageMagick может как минимум загружать шрифты ttf.

РЕДАКТИРОВАТЬ: Gimp поддерживает только данные RGB в качестве выходного формата, поэтому это не решение для вас.

В любом случае, вот вам буква «б»:


/* GIMP RGB C-Source image dump (b.c) */

static const struct {
  unsigned int   width;
  unsigned int   height;
  unsigned int   bytes_per_pixel; /* 3:RGB, 4:RGBA */ 
  char          *comment;
  unsigned char  pixel_data[8 * 8 * 3 + 1];
} gimp_image = {
  8, 8, 3,
  "Created with GIMP",
  "\377\377\377\377\377\377\0\0\0\377\377\377\377\377\377\377\377\377\377\377"
  "\377\377\377\377\377\377\377\377\377\377\0\0\0\377\377\377\377\377\377\377"
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\377\377"
  "\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0"
  "\0\0\0\377\377\377\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377"
  "\0\0\0\377\377\377\377\377\377\377\377\377\0\0\0\377\377\377\377\377\377"
  "\377\377\377\0\0\0\377\377\377\377\377\377\377\377\377\0\0\0\377\377\377"
  "\377\377\377\377\377\377\0\0\0\377\377\377\377\377\377\0\0\0\377\377\377"
  "\377\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377"
  "\377\377\377",
};
person quinmars    schedule 28.01.2010
comment
Получив изображение в таком виде, в RGB, вы можете выполнить некоторую постобработку, чтобы получить черно-белое изображение. - person Craig McQueen; 29.01.2010
comment
Не могли бы вы поделиться инструкциями Gimp для создания этого кода? Это именно то, что я хочу сделать для рендеринга шрифтов для простой встроенной системы. - person GrandAdmiral; 14.11.2013

«Пиксельные шрифты» могут быть хорошим ресурсом: http://www.alvit.de/blog/article/25-best-license-free-pixelfonts

person dkantowitz    schedule 01.02.2010
comment
Извините... сервер, должно быть, не работает :( - person whitey04; 04.02.2016
comment
Сервер снова не работает. - person EchoLynx; 05.08.2019

Я знаю, что это не ответ на ваш вопрос, но я бы рекомендовал просто использовать что-то вроде http://www.angelcode.com/products/bmfont/ для создания простого растрового шрифта. Загрузка файла tga довольно проста. Я бы не ожидал, что краудсорсинговый шрифт будет выглядеть очень красиво.

person Dolphin    schedule 28.01.2010
comment
Мне не нужно, чтобы это выглядело красиво, это для быстрой и грязной пометки изображений :-) - person fortran; 28.01.2010

Исходя из Archlinux, я всегда сначала просматриваю как официальные, так и пользовательские репозитории пакетов. Существует множество шрифтов bdf, которые вы можете использовать как отдельные пакеты, а также скрипт bdf2c, который вы можете используйте, чтобы преобразовать его.

person Adam    schedule 06.07.2021

person    schedule
comment
все символы ascii, надеюсь, это поможет вам. - person nimbus_debug; 17.04.2014
comment
Блин, откуда ты это взял? - person AJP; 01.11.2014
comment
Аккуратный. Я заметил, что более низкие строки сканирования идут первыми, а левые пиксели имеют более значащие биты. - person Qwertie; 30.06.2017
comment
Компания Silicon Graphics опубликовала эту растровую карту здесь: courses.cs. washington.edu/courses/cse457/98a/tech/OpenGL/font.c Настоящим предоставляется разрешение на использование, копирование, изменение и распространение этого программного обеспечения для любых целей и бесплатно... - person Mark Lakata; 31.01.2018
comment
Я попытался использовать эту таблицу растровых шрифтов и столкнулся с проблемой переворачивания текста как по вертикали, так и по горизонтали. Таким образом, буквы были перевернуты, и они также были перевернуты слева направо. В итоге я преобразовал вывод так, чтобы вместо того, чтобы идти слева направо с каждой строкой символов, я вместо этого проходил справа налево. Затем, помещая каждый пиксель, я переходил с бита 7 на бит 0, а не с бита 0 на бит 7. В других таблицах растровых шрифтов, которые я пробовал, у меня не было этой проблемы, включая использование шрифта dhepper 8x8, упомянутого в другом ответе. - person Richard Chambers; 08.05.2021