CreatePatternBrush и глубина цвета экрана - PullRequest
2 голосов
/ 04 июня 2010

Я создаю кисть, используя CreatePatternBrush с растровым изображением, созданным с помощью CreateBitmap.

Растровое изображение имеет ширину 1 пиксель и высоту 24 пикселя, у меня есть значение RGB для каждого пикселя, поэтому я создаю массив rgbquadsи передать его в CreateBitmap.

Это прекрасно работает, когда глубина цвета экрана составляет 32 бита на пиксель, поскольку создаваемое растровое изображение также составляет 32 бита на пиксель.

Когда глубина цвета экрана не равна 32 бита на пиксель, это не получается,и я понимаю, почему это так, поскольку вместо этого я должен создать совместимое растровое изображение.

Похоже, что вместо этого я должен использовать CreateCompatibleBitmap, но как мне поместить имеющиеся у меня пиксельные данные в это растровое изображение?

Я также читал о CreateDIBPatternBrushPt, CreateDIBitmap, CreateDIBSection и т.д.растровое изображение с той же глубиной цвета, что и на экране, но как мне создать его, используя только пиксельные данные 32bpp?

Ответы [ 2 ]

2 голосов
/ 06 июня 2010

Вы можете создать DIB, потому что вы можете использовать Независимое от устройства растровое изображение независимо от глубины цвета экрана. См. CreateDIBSection () .

Как вы можете создать его, используя только данные пикселей 32bpp? DIB может быть создан с данными 32bpp. Как вы можете прочитать в документации:

Функция CreateDIBSection создает DIB, в который приложения могут писать непосредственно. Функция дает вам указатель на местоположение растрового изображения битовые значения. Если hSection равен NULL, система выделяет память для DIB. Если функция завершается успешно, возвращаемое значение дескриптор недавно созданного DIB, и * ppvBits указывает на битовые значения битовой карты.

Попробуйте что-то вроде этого:

VOID *ppvBits = NULL;
BITMAPINFO BitmapInfo;
memset(&BitmapInfo, 0, sizeof(BITMAPINFOHEADER));
BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfo.bmiHeader.biWidth = 1;
BitmapInfo.bmiHeader.biHeight = 24;
BitmapInfo.bmiHeader.biPlanes = 1;
BitmapInfo.bmiHeader.biBitCount = 32;
BitmapInfo.bmiHeader.biCompression = BI_RGB;
HBITMAP hBitmap = CreateDIBSection(hDC, &BitmapInfo, DIB_RGB_COLORS, &ppvBits, NULL, 0);

В нашем случае * ppvBits указывает на 1 * 24 * (32/8) выделенных байтов.

Важно знать, что если biHeight положителен, битовая карта является DIB снизу вверх, а ее источником является левый нижний угол. См. BITMAPINFOHEADER Структура для получения дополнительной информации.

0 голосов
/ 04 июня 2010

Я решил это с помощью CreateCompatibleBitmap и SetPixel. Не самый лучший вариант, я думаю, но он работает.

...