массив для растрового изображения в C ++ - PullRequest
2 голосов
/ 19 февраля 2012

Я хотел бы создать растровое изображение, превратив массив в растровое изображение. Сначала я создаю растровое изображение из данных:

BITMAPINFO info;
info.bmiHeader.biBitCount = 32;
info.bmiHeader.biClrImportant = 0;
info.bmiHeader.biClrUsed = 0;
info.bmiHeader.biCompression = BI_RGB;
info.bmiHeader.biHeight = -height(windowSize);
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biSizeImage = 0;
info.bmiHeader.biWidth = width(windowSize);
info.bmiHeader.biXPelsPerMeter = 100;
info.bmiHeader.biYPelsPerMeter = 100;
Gdiplus::Bitmap *b = new Bitmap(&info, (void *)field);

А потом я пытаюсь нарисовать его на экране, но он содержит только черный цвет:

Gdiplus::Graphics *graphics = new Gdiplus::Graphics(hdc);
...
graphics->DrawImage(<pointer to bitmap>, 0, 0);

В настоящее время массив содержит 32 бита данных на пиксель, по 8 бит на каждый компонент. Красный компонент сдвинут на 24 бита влево, зеленый сдвинут на 16 бит влево, а синий смещен на 8 бит влево.

Я могу заверить вас, что массив полей содержит данные, в которых цвета не все черные. У кого-нибудь есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 05 марта 2012

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

Если вы хотите скопировать данные и сохранить их в объекте Bitmap, используйте NULL для битов изображения (или используйте конструктор, не требующий указателя на биты изображения) и используйте функцию Bitmap.LockBits для заполнения в данных. Вам не нужно копировать биты вручную; просто заполните структуру BitmapData и используйте флаги ImageLockModeWrite | ImageLockModeUserInputBuf, и GDI + сам скопирует биты.

Вам также может повезти с конструктором Bitmap (INT, INT, INT, PixelFormat, BYTE *) (см. http://msdn.microsoft.com/en-us/library/ms536315%28v=vs.85%29.aspx), поскольку он дает вам более прямой контроль над тем, как GDI + будет интерпретировать данные (включая создание очевидно, содержат ли ваши данные альфа-информацию).

...