как использовать GDI для считывания пикселей из растрового изображения?

#windows #bitmap #gdi #pixels

#Windows #растровое изображение #gdi #пиксель

Вопрос:

Я использовал множество других методов для чтения пиксельных данных из файлов, но мне показалось хорошей идеей попробовать использовать GDI. Документация немного расплывчата для неэкранных контроллеров домена, поэтому я как бы хватаюсь за соломинку.

Вот что у меня есть прямо сейчас, и в нем говорится, что все пиксели находятся за пределами (печатается ‘x’).

 #include <windows.h>
#include <iostream>

using namespace std;

#define filename "test.bmp"


int main()
{
    HBITMAP hBmp;
    hBmp = (HBITMAP)LoadImage(NULL,(LPCTSTR)filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_SHARED);
    if( hBmp==NULL )
    {
        cout<< "could not loadn";
        system("pause");
        return 0;
    }

    BITMAP bmp;
    HDC hdc = CreateCompatibleDC(NULL);
    GetObject(hBmp,sizeof(bmp),amp;bmp);
    BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hdc,0,0,SRCCOPY);

    for(int y=0;y<bmp.bmHeight;y  )
    {
        for(int x=0;x<bmp.bmWidth;x  )
        {
            if(x==0) 
                cout<< endl;

            COLORREF clr;
            clr = GetPixel(hdc,x,y);

            if( clr != CLR_INVALID )
                cout<< 0 (int)(clr==0);
            else 
                cout<< 'x';
        }
    }
    system("pause");

    DeleteDC(hdc);
    DeleteObject(hBmp);

    return 0;
}
  

Ответ №1:

Вы должны выбрать растровое изображение для вашего dc:

 HBITMAP hOldBmp = SelectObject(hdc, hBmp);

// I haven't understood what you're trying to achieve with this line of code
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hdc,0,0,SRCCOPY);

   ....

SelectObject(hDc, hOldBmp);
DeleteDC(hdc);
   ....
  

Когда вы создаете memory dc, по умолчанию в нем выбирается растровое изображение размером 1×1.