Получение растровых значений пикселей с помощью функции Windows GetDIBits - PullRequest
3 голосов
/ 28 декабря 2011

Я пытаюсь получить пиксели растрового изображения, используя функцию 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 ]

1 голос
/ 28 декабря 2011

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

1 голос
/ 28 декабря 2011

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

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

...