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-битный файл растровых изображений 10×10. Первые несколько строк вывода выглядят так:

0
0
255

255
0
0

0
255
0

0
0
255

И меняется не только порядок значений; некоторые значения цвета равны 0, когда их не должно быть. Последние несколько значений COLORREF — RGB (0,0,0). В чем может быть проблема с кодом?

0

Решение

Похоже, что ваши значения смещены, вероятно, потому что вы пропустили байт.

Вы должны проверить, что BMP файл на самом деле 24bit RGB растровое изображение, а не что-то вроде 32bit RGBA,

Попробуйте поставить немного подсчета 32 вместо 24, может быть неиспользованный байт в вашем BMP пикселей:

bmpInfo.bmiHeader.biBitCount = 32;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]