Получение растровых значений пикселей с помощью функции Windows GetDIBits

Я пытаюсь получить пиксели растрового изображения с помощью функции GetDIBits. Поскольку я не изучал Windows GDI/API, я очень не уверен относительно первого аргумента, HDC. Я искал бесчисленные сообщения здесь в SO и в Интернете, но не смог найти информацию или пример о том, как инициализировать HDC в этом конкретном случае. Вот как далеко я зашел, читая значения пикселей:

    HBITMAP hBitmap = (HBITMAP) LoadImage(0, L"C:/tmp/Foo.bmp" ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    // check hBitmap for error

    BITMAP bm;
    ::GetObject( hBitmap , sizeof(bm) , &bm );

    // TODO: GetDIBits()


Решение:

Еще раз прочесав сеть, я смог собрать следующее:

    /* Omitting error checks for brevity */
    HDC dcBitmap = CreateCompatibleDC ( NULL );
    SelectObject( dcBitmap, hBitmap );

    BITMAPINFO bmpInfo;
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = bm.bmWidth;
    bmpInfo.bmiHeader.biHeight = -bm.bmHeight;
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biBitCount = 24;
    bmpInfo.bmiHeader.biCompression = BI_RGB;        
    bmpInfo.bmiHeader.biSizeImage = 0;        

    COLORREF* pixel = new COLORREF [ bm.bmWidth * bm.bmHeight ];
    GetDIBits( dcBitmap , hBitmap , 0 , bm.bmHeight , pixel , &bmpInfo , DIB_RGB_COLORS );

2 ответа

Ваша цель получить значения цвета пикселей или вызвать GetDIBits? Если вы просто хотите контент в пикселях, вы можете использовать GetObject чтобы получить BITMAP структура, соответствующая вашему HBITMAP ручка, bmBits указатель в этой структуре предоставляет доступ к пикселям (примечание: он будет в исходном формате растрового изображения, который может быть не 24bpp, поэтому проверьте другие поля структуры, чтобы увидеть, что это за формат).

Исходное растровое изображение обычно является зависимым от устройства растровым изображением. Хотя в настоящее время это не так часто, это может означать, что значения пикселей растрового изображения хранятся в виде индексов в таблице цветов. В этих случаях для GetDIBits необходим доступ к таблице цветов, которая хранится в контексте устройства.

Если в вашем растровом изображении вместо индексов используются значения RGB, тогда контекст устройства не должен иметь значения, хотя по моему опыту вы все равно должны предоставить действительный (см. Для чего нужен HDC в GetDIBits?), Возможно, он рассматривает другие аспекты устройства. контекст, как глубина цвета.

Другие вопросы по тегам