Запись правильных результатов растрового файла

История:

Я создавал средство визуализации шрифтов для DirectX9 для рисования текста. Фактическая проблема возникла из-за другой проблемы, мне было интересно, почему текстура ничего не рисовала (мой неправильный рисунок), поэтому я попытался скопировать рисунок в файл и понял, что текущая проблема. ура

Вопрос:

Что именно я делаю не так? Я имею в виду, что я просто копирую свой массив пикселей CURRENT в моей растровой оболочке в файл с некоторым другим содержимым (информация о растровых изображениях), я видел в шестнадцатеричном редакторе, что после заголовков растровых изображений есть цвета.

Фотографий:

Это результат растрового изображения, которое я записал в файловую систему

Код:

CFont :: DrawGlyphToBitmap

Этот код копирует из растрового изображения FreeType глиф (который, между прочим, имеет формат пикселя FT_PIXEL_MODE_BGRA) к
экземпляр класса растрового шрифта

void CFont::DrawGlyphToBitmap ( unsigned char * buffer, int rows, int pitch,     int destx, int desty, int format )
{
CColor color = CColor ( 0 );for ( int row = 0; row < rows; row++ )
{
int x = 0;
for ( int left = 0; left < pitch * 3; left += 3,x++ )
{
int y = row;
unsigned char* cursor = &buffer [ ( row*pitch ) + left ];
color.SetAlphab ( 255 );
color.SetBlueb ( cursor [ 0 ] );
color.SetGreenb ( cursor [ 1 ] );
color.SetRedb ( cursor [ 2 ] );
m_pBitmap->SetPixelColor ( color, destx + x, desty + y );
}
}
}

CBitmap :: SetPixelColor

Этот код устанавливает один «пиксель» / цвет в своем локальном пиксельном хранилище.

void CBitmap::SetPixelColor ( const CColor & color, int left, int top )
{
unsigned char* cursor = &m_pBuffer [ ( m_iPitch * top ) + ( left *     bytes_per_px ) ];
cursor [ px_red ] = color.GetRedb ( );
cursor [ px_green ] = color.GetGreenb ( );
cursor [ px_blue ] = color.GetBlueb ( );
if ( px_alpha != 0xFFFFFFFF )
cursor [ px_alpha ] = color.GetAlphab ( );
}

CBitmap :: Сохранить

Вот выход функции, которая пишет
растровое изображение в файловой системе, это показывает, как
я инициализирую битовый информационный контейнер (заголовок файла & заголовок «dib»)

void CBitmap::Save ( const std::wstring & path )
{

BITMAPFILEHEADER bitmap_header;
BITMAPV5HEADER bitmap_info;

memset ( &bitmap_header, 0, sizeof ( BITMAPFILEHEADER ) );
memset ( &bitmap_info, 0, /**/sizeof ( BITMAPV5HEADER ) );

bitmap_header.bfType = 'B' + ( 'M' << 8 );//0x424D;
bitmap_header.bfSize = bitmap_header.bfOffBits + ( m_iRows * m_iPitch ) * 3;
bitmap_header.bfOffBits = sizeof ( BITMAPFILEHEADER ) + sizeof ( BITMAPV5HEADER );

double _1px_p_m = 0.0002645833333333f;

bitmap_info.bV5Size = sizeof ( BITMAPV5HEADER );
bitmap_info.bV5Width = m_iPitch;
bitmap_info.bV5Height = m_iRows;
bitmap_info.bV5Planes = 1;
bitmap_info.bV5BitCount = bytes_per_px * 8;
bitmap_info.bV5Compression = BI_BITFIELDS;
bitmap_info.bV5SizeImage = ( m_iPitch * m_iRows ) * 3;
bitmap_info.bV5XPelsPerMeter = m_iPitch * _1px_p_m;
bitmap_info.bV5YPelsPerMeter = m_iRows * _1px_p_m;
bitmap_info.bV5ClrUsed = 0;
bitmap_info.bV5ClrImportant = 0;
bitmap_info.bV5RedMask = 0xFF000000;
bitmap_info.bV5GreenMask = 0x00FF0000;
bitmap_info.bV5BlueMask = 0x0000FF00;
bitmap_info.bV5AlphaMask = 0x000000FF;
bitmap_info.bV5CSType = LCS_WINDOWS_COLOR_SPACE;

...
-> the other part does just write those structures & my px array to file

}

CBitmap «полезные» макросы

я сделал макросы для массива пикселей, потому что я «изменил»
«форматировать» пиксель много раз -> чтобы сделать его «проще», я сделал те макросы, которые облегчают выполнение этого

#define bytes_per_px 4
#define px_red       0
#define px_green     1
#define px_blue      2
#define px_alpha     3

Заметки

  • У моего растрового изображения есть порядок цветов RGBA

0

Решение

Этот расчет неверен:

&m_pBuffer [ ( m_iPitch * top ) + ( left * bytes_per_px ) ]

Так должно быть:

&m_pBuffer [ ( ( m_iPitch * top ) + left ) * bytes_per_px ]

Каждый ряд m_iPitch * bytes_per_px байт в ширину. Если вы просто умножить на m_iPitchтогда ваши «строки» перекрывают друг друга.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]