Как определить, является ли DIB восходящим или нисходящим?
Вопрос
Если я создам DIB, используя CreateDIBSection()
, я могу указать, должно ли это быть сверху вниз или снизу вверх, установив biHeight
поле BITMAPINFOHEADER
struct в отрицательное или положительное значение.Однако, если я позвоню GetObject()
на таком растровом изображении, чтобы заполнить DIBSECTION
структуру, то оба dsBm.bmHeight
и dsBmih.biHeight
кажутся всегда позитивными.
Есть ли способ узнать, является ли DIB нисходящим или восходящим, когда все, что у меня есть, это HBITMAP
?
Решение
Я думаю, лучшее, что вы сможете получить от HBITMAP, — это GetDIBits.Однако проблема с GetDIBits заключается в том, что для него также требуется HDC, а HBITMAP должен быть DDB.
видеть: Функция GetDIBits
Я не уверен, но возможно, вы потеряете нисходящую структуру при преобразовании.
Другие советы
Нет;для этого вам понадобится BITMAPINFOHEADER, и его невозможно восстановить из HBITMAP.
Невозможно получить эту информацию из GDI.Как вы уже заметили, поля BITMAP и BITMAPINFOHEADER bmHeight, полученные с помощью GetObject, всегда положительны.Поле bmWidthBytes также имеет положительное значение.Если вы рисуете на DIBSection (или из него), используя дескриптор GDI, GDI нарисует DIBSection правильным путем вверх.Использование извлеченного BITMAPINFOHEADER приведет к неправильному отображению растровых изображений сверху вниз.
Кажется, что единственный способ отличить пользовательский режим - использовать GDI для тестирования: установить для верхнего левого и нижнего левого пикселей растрового изображения два разных значения, а затем прочитать буфер, чтобы увидеть, какая запись попала в первую ячейку памяти.
На самом деле лучший вариант - встроить его в свой API - всякий раз, когда вы передаете DIBSection как HBITMAP, убедитесь, что также передан или сохранен хотя бы bool fIsDibSectionTopDown.