Как определить, является ли DIB восходящим или нисходящим?

StackOverflow https://stackoverflow.com/questions/662853

  •  20-08-2019
  •  | 
  •  

Вопрос

Если я создам 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top