В чем разница между растровым изображением Windows и DIBSection?
Вопрос
Я загружаю DIBSection из файла со следующим:
родовое словоЭмпирическим путем я обнаружил следующие различия между загруженным растровым изображением и растровыми изображениями, которые я использовал в прошлом, но я не могу найти никакой документации о том, что разница должна быть.
- Строки упорядочены в памяти сверху вниз, а не снизу вверх. Я убедился, что сам файл .bmp упорядочен снизу вверх.
- Заполнение строки кратно 2 байтам, а не 4.
Я также обнаружил документально подтвержденное различие при использовании CreateDIBSection
чтобы создать DIBSection с нуля.
- Значения DIBSECTION.dsHandle и BITMAP.bmBits, возвращаемые функцией
GetObject
, будут NULL.
Где документация по первым двум различиям, и я что-нибудь упустил? Это касается Windows 7, но я не могу себе представить, что в других версиях Windows все будет иначе.
Изменить: некоторые дополнительные сведения. Вот шестнадцатеричный дамп кода temp.bmp
; это изображение 7x7 с белой полосой по правой стороне и синими значениями, увеличивающимися по левой стороне (0x10,0x20 и т. д.). Вы можете видеть, что нижняя строка (00,00,70) является первой и что есть 3 байта заполнения.
Вот пример программы для чтения файла .bmp и записи его содержимого. Я удалил проверку ошибок для краткости.
родовое словоИ вот результат работы вышеуказанной программы вместе с шестнадцатеричным дампом созданного файла:
родовое словоРешение
Вызовите GetDIBits вместо GetBitmapBits.Документы для GetBitmapBits ( здесь )указывают, что это возвращает данные для зависящего от устройства растрового изображения, тогда как у вас есть независимое от устройства растровое изображение.Они также указывают, что этот вызов не следует использовать и предназначен только для 16-битной совместимости.Итак, использование GetDIBits должно помочь.