tt c Шрифт в Bitmap в C ++ - PullRequest
       8

tt c Шрифт в Bitmap в C ++

0 голосов
/ 20 января 2020

Есть ли простой способ вставить шрифт в растровое изображение? В настоящее время я использую следующий класс для редактирования своего растрового изображения:

class BitmapImg{
public:
 BitmapImg();
 ~BitmapImg();
 void setPixel(int x, int y, int redn, int greenn, int bluen);
 void getPixel(int x, int y, int& redn, int& greenn, int& bluen);
private:
 unsigned short int red[1080][1080]; //1080X1080 Pixels
 unsigned short int green[1080][1080];
 unsigned short int blue[1080][1080];
};

Но теперь я начал импортировать буквы через xbm-файл в XCode, которые затем используют различные циклы для изменения моих значений RGB в массиве. Но это решение очень сложное.

Кроме того, у меня есть проблемы с выводом отдельных битов. В настоящее время я использую этот l oop для изменения моих пикселей в растровом изображении:

BitmapImg Picture;
// ctor makes is completely blue -> no problem with the whit color below
int counter = 0;
for (int y=0;y<=199;y++)
{
    for (int x = 0; x<=199 ;x++)
    {
        for (int n = 0; n<16;n++)
        {
            bool bit =(A_bits[counter]>>n) & 1U;

            if(bit)
              Picture.setPixel(counter%200,counter%200,255,255,255);
            counter ++;
            std::cout << counter<< std::endl; //for debugging
        }
    }
}

Заголовок xvm-файла: #define A_width 200 #define A_height 200 stati c unsigned short A_bits [] = {0x0000, 0x0000, ....}

Файл xbm описывает «A», но я получаю только одну ширину в один пиксель по диагонали слева вверху.

Если у вас есть решение Я был бы очень признателен за одну из двух проблем!

1 Ответ

0 голосов
/ 20 января 2020

Кроме того, у меня проблемы с выводом отдельных битов. В настоящее время я использую это l oop, чтобы изменить мои пиксели в растровом изображении:

В основном здесь вы пытаетесь скопировать пиксели из одного изображения в другое. XBM - это просто очень простой c моно формат, поэтому просто вопрос установки пикселя на нужный цвет (передний план) или оставления его как есть (фон).

Это почти то, что у вас есть. Обратите внимание, что этот dr aws находится в верхнем левом углу (0,0) изображения и предполагает, что конечное изображение достаточно велико. Вы должны добавить проверку границ, чтобы безопасно обрезать рисунок.

void draw_A(BitmapImg &picture, unsigned short r, unsigned short g, unsigned short b)
{
    for (int y = 0; y < A_height; ++y)
    {
        for (int x = 0; x < A_width; ++x)
        {
            unsigned bytes_per_row = (A_width + 7) / 8; // divide rounding up
            unsigned row_byte = x / 8; // 8 bits per byte
            unsigned row_bit = x % 8;
            unsigned char src_byte = A_bits[y * bytes_per_row + row_byte]; // row by row, left to right, top to bottom
            bool src_bit = ((src_byte >> row_bit) & 0x1) != 0; // least signifcant bit (1) is first
            if (src_bit)
            {
                picture.setPixel(x, y, r, g, b);
            }
        }
    }
}

unsigned short int red[1080][1080]; //1080X1080 Pixels
unsigned short int green[1080][1080];
unsigned short int blue[1080][1080];

Обратите внимание, что это довольно необычный способ хранения данных изображения, обычно каждый пиксель сохраняется вместе в одном массиве двумерные массивы также не работают с динамическим размером c (вы не можете p = new unsigned short[width][height]; p[50][40] = 10;).

Например, 24-битный RGB 8 бит на секунду может быть сохранен как unsigned char pixels[width * height * 3]; pixels[50 * 3 + 40 * width * 3 + 1] = 10; /*set green at (50,40)*/. Вы увидите это при работе с данными изображений во многих библиотеках и форматах файлов. Хотя следует помнить, что некоторые форматы изображений особенно начинаются снизу, а не сверху.

Но теперь я начал импортировать буквы через xbm-файл в XCode, которые затем используют различные циклы для изменения моих значений RGB. в массиве. Но это решение очень сложное.

Делать многие вещи напрямую с изображениями, однако, как правило, становится довольно сложно, особенно после того, как вы начнете учитывать прозрачность / смешивание, преобразует как масштабирование, вращение, все различные форматы изображений в иметь дело с (индексированный цвет, 16,24,32 и т. д. c. битовые целочисленные пиксели, форматы снизу вверх, а не сверху вниз и т. д. c.).

Существует много графики библиотеки с аппаратным ускорением и программным обеспечением, спецификация платформы c (например, все Windows GDI, DirectWrite, Direct2D, Direct3D и др. c. вещи) или портативные. Многие из этих библиотек будут поддерживать ввод и вывод изображений в этом стиле, используя различные форматы для указанных c пикселей и множество решений для преобразования одного формата в другой при необходимости.

...