GetDIBits() возвращает неправильные значения BGR:
GetDIBits() не передает правильные значения BGR в массив COLORREF:
#include <windows.h>
#include <iostream>
using namespace std;
int main() {int i; HBITMAP hBit; HDC bdc; BITMAPINFO bmpInfo; COLORREF pixel[100];
hBit=(HBITMAP)LoadImage(NULL,(LPCTSTR)"F:\\bitmap.bmp",IMAGE_BITMAP,10,10,LR_LOADFROMFILE);
bdc=CreateCompatibleDC(NULL);
SelectObject(bdc,hBit);
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFO);
bmpInfo.bmiHeader.biWidth=10;
bmpInfo.bmiHeader.biHeight=-10;
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biBitCount=24;
bmpInfo.bmiHeader.biCompression=BI_RGB;
bmpInfo.bmiHeader.biSizeImage=0;
GetDIBits(bdc,hBit,0,10,pixel,&bmpInfo,DIB_RGB_COLORS);
for (i=0; i<100; i++) {
cout<<GetBValue(pixel[i]);
cout<<GetGValue(pixel[i]);
cout<<GetRValue(pixel[i]);
cout<<endl;
}
ReleaseDC(NULL,bdc);
DeleteDC(bdc);
DeleteObject(hBit);
free(pixel);
while (1) {}
}
bitmap.bmp - это полностью синий (RGB(0,0,255)) 24-битный файл растровых изображений 10x10. Первые несколько строк вывода выглядят так:
0 0 255
255 0 0
0 255 0
0 0 255
И меняется не только порядок значений; некоторые значения цвета равны 0, когда их не должно быть. Последние несколько значений COLORREF - RGB(0,0,0). В чем может быть проблема с кодом?
1 ответ
Решение
Похоже, что ваши значения смещены, вероятно, потому что вы пропустили байт.
Вы должны проверить, что BMP
файл на самом деле 24bit RGB
растровое изображение, а не что-то вроде 32bit RGBA
,
Попробуйте поставить немного подсчета 32
вместо 24
, может быть неиспользованный байт в вашем BMP
пикселей:
bmpInfo.bmiHeader.biBitCount = 32;