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-битный файл растровых изображений 10×10. Первые несколько строк вывода выглядят так:
0
0
255
255
0
0
0
255
0
0
0
255
И меняется не только порядок значений; некоторые значения цвета равны 0, когда их не должно быть. Последние несколько значений COLORREF — RGB (0,0,0). В чем может быть проблема с кодом?
Похоже, что ваши значения смещены, вероятно, потому что вы пропустили байт.
Вы должны проверить, что BMP
файл на самом деле 24bit RGB
растровое изображение, а не что-то вроде 32bit RGBA
,
Попробуйте поставить немного подсчета 32
вместо 24
, может быть неиспользованный байт в вашем BMP
пикселей:
bmpInfo.bmiHeader.biBitCount = 32;
Других решений пока нет …