Как определить, является ли DIB восходящим или нисходящим? - PullRequest
4 голосов
/ 19 марта 2009

Если я создаю DIB, используя CreateDIBSection(), я могу указать, должен ли он быть сверху вниз или снизу вверх, установив для поля biHeight структуры BITMAPINFOHEADER отрицательное или положительное значение. Однако, если я вызову GetObject() на таком растровом изображении, чтобы заполнить структуру DIBSECTION, то и dsBm.bmHeight, и dsBmih.biHeight кажутся всегда положительными.

Есть ли способ узнать, является ли DIB сверху вниз или снизу вверх, когда у меня есть только HBITMAP?

Ответы [ 3 ]

1 голос
/ 21 мая 2009

Нет способа извлечь эту информацию из GDI. Как вы уже обнаружили, BITMAP И BITMAPINFOHEADER поля bmHeight, полученные через GetObject, всегда положительны. Поле bmWidthBytes также является положительным. Если вы рисуете (или из) DIBSection, используя дескриптор GDI, GDI будет рисовать DIBSection правильным образом вверх. Использование извлеченного BITMAPINFOHEADER приведет к неправильному отображению растровых изображений сверху вниз.

Казалось бы, единственный способ узнать из пользовательского режима - использовать GDI для тестирования - установите в пикселях верхнего левого и нижнего левого пикселей растрового изображения два разных значения, затем прочитайте буфер, чтобы увидеть, какая запись находится в первом месте памяти .

На самом деле лучший вариант - встроить в свой API - когда вы передаете DIBSection как HBITMAP, убедитесь, что по крайней мере bool fIsDibSectionTopDown передан или сохранен.

1 голос
/ 19 марта 2009

Нет; для этого вам нужен BITMAPINFOHEADER, и его невозможно восстановить из HBITMAP.

0 голосов
/ 20 марта 2009

Я думаю, что лучшее, что вы сможете получить от HBITMAP, это GetDIBits. Однако проблема с GetDIBits заключается в том, что для него также требуется HDC, а HBITMAP должен быть DDB.

см .: Функция GetDIBits

Я не уверен, но возможно, что вы потеряете нисходящий поток в конверсии.

...