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;
Другие вопросы по тегам