ASCII в черно-белый BMP, затем сжатие

Мой первый вопрос, поэтому я постараюсь быть максимально описательным.

У меня есть TFT-дисплей, который я подключил к шине встроенного процессора (64 КБ ОЗУ, очевидно, без ОС). Я написал класс C++ для установки пикселей на дисплее. Моя цель - печатать письма. Каждый пиксель буквы должен быть описан только 1 битом: включен или выключен. Я представил себе создание заголовочного файла следующего формата:

#ifndef ABC_H
#define ABC_H

namespace ABC{
    const unsigned int a[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
}

#endif

Символ выше, который я назвал «ABC::a», представляет собой тонкий белый прямоугольник с черным прямоугольником сверху и снизу. У меня есть программа, которая превращает файлы bmp в заголовочный файл выше. Массив имеет длину 32 целых числа, и каждое целое число имеет длину 32 бита (вероятно, я буду использовать uint32_t в финальном наброске, так что не волнуйтесь!). Фактически это означает, что я описал один символ ASCII как bmp 32x32. Чтобы напечатать его в указанной координате (X, Y), мне просто нужно сделать это:

void PrintChar(const int* c,X,Y){
    for(unsigned int y=0; y<32; y++)
        for(unsigned int x=0; x<32; x++)
            if(c[y] & 1<<x)
                SetPixel(x+X,y+Y); //SetPixel(x,y) lights up a pixel at coordinates (x,y) on the display
}

Вопрос: Как можно сгенерировать 32x32 bmps символов ASCII, желательно не утомительно вручную с помощью paint.exe. В качестве альтернативы один раз, есть ли у кого-то лучшее средство для достижения цели, которую я хочу (например, как-то пропустить программу посредника)? В качестве альтернативы дважды, я просто тупой, и есть гораздо лучший способ описать символы ASCII для моих целей?

Примечание. Я понимаю, что использование C++ для встроенного процессора является сомнительной практикой (по крайней мере, я так думаю), но это то, что мне было приказано сделать. / пожимает плечами

редактировать: игнорировать часть сжатия! Я справлюсь с этим сам (если вы действительно не хотите поделиться некоторыми идеями, тогда дайте волю!).


person Suedocode    schedule 18.06.2012    source источник
comment
Выберите шрифт, нарисуйте в памяти bmp, прочитайте пиксели, сохраните как const unsigned foo[]   -  person Erik    schedule 18.06.2012
comment
Я никогда не делал ничего подобного раньше. Как рисовать в inmem bmp? Я пытаюсь найти его, но ничего не могу найти.   -  person Suedocode    schedule 18.06.2012


Ответы (2)


Вы можете использовать любую графическую библиотеку, чтобы отрисовывать символы в буфер, а затем создавать данные о ваших персонажах из буфера.

В Windows наиболее очевидным способом будет использование GDI+ и ClearType, или вы можете взглянуть на Cairo< /а>. Если вам нужен полный контроль над отображением символов, я предлагаю использовать Freetype.

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

person Ruud    schedule 18.06.2012
comment
Freetype был фантастическим предложением. Большое тебе спасибо. - person Suedocode; 19.06.2012

Ниже приведен терминальный шрифт. Каждая буква имеет ширину 8 пикселей и длину 10 пикселей. Каждое деление из 8 символов (по 80 на букву) соответствует одной вертикальной полосе в букве. Например, буква a ниже имеет первые 8 цифр как 0, это означает, что первая вертикальная линия белая.

a: 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0
b: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0
c: 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,1,0,0
d: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0
e: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,0,0,0,0,0,1,1,0
f: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0
g: 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,0
h: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0
i: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
j: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0
k: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,1,1,0
l: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0
m: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0
n: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0
o: 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0
p: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0
q: 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1
r: 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,1,1,0
s: 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,1,1,1,1,1,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,1,1,1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0
t: 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
u: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
v: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0
w: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0
x: 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0
y: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
z: 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,0,1,1,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,1,1,0

И они соответствуют буквам этого изображения:

Изображение шрифта терминала

person test    schedule 18.06.2012
comment
Как, черт возьми, ты это сделал! Во всяком случае, это начало. - person Suedocode; 18.06.2012
comment
@Aggieboy: Вероятно, он просто взял какой-нибудь растровый шрифт, например Terminal, и просто извлек из него растровые изображения. - person datenwolf; 19.06.2012