2012-01-25 3 views
5

Я искал, и я понял, что мне нужно будет использовать GetDIBits(). Я не знаю, что делать с параметром out LPVOID lpvBits.Как получить доступ к цвету пикселей в растровом изображении?

Не мог бы кто-нибудь объяснить это мне? Мне нужно получить информацию о цвете пикселей в двумерной матричной форме, чтобы я мог получить информацию для конкретной (x, y) координатной пары.

Я программирую на C++ с использованием Win32 API.

+0

возможного дубликата [GetDIBits и перебрать пикселей используя X, Y] (h ttp: //stackoverflow.com/questions/3688409/getdibits-and-loop-through-pixels-using-x-y) –

ответ

1

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

+1

Обычно вы не хотите использовать GetPixel для извлечения всех пикселей, он становится довольно медленным. – pezcode

5

сначала вам нужно растровое изображение и откройте это

HBITMAP hBmp = (HBITMAP) LoadImage(GetModuleHandle(NULL), _T("test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

if(!hBmp) // failed to load bitmap 
    return false; 

//getting the size of the picture 
BITMAP bm; 
GetObject(hBmp, sizeof(bm), &bm); 
int width(bm.bmWidth), 
    height(bm.bmHeight); 

//creating a bitmapheader for getting the dibits 
BITMAPINFOHEADER bminfoheader; 
::ZeroMemory(&bminfoheader, sizeof(BITMAPINFOHEADER)); 
bminfoheader.biSize  = sizeof(BITMAPINFOHEADER); 
bminfoheader.biWidth  = width; 
bminfoheader.biHeight  = -height; 
bminfoheader.biPlanes  = 1; 
bminfoheader.biBitCount = 32; 
bminfoheader.biCompression = BI_RGB; 

bminfoheader.biSizeImage = width * 4 * height; 
bminfoheader.biClrUsed = 0; 
bminfoheader.biClrImportant = 0; 

//create a buffer and let the GetDIBits fill in the buffer 
unsigned char* pPixels = new unsigned char[(width * 4 * height)]; 
if(!GetDIBits(CreateCompatibleDC(0), hBmp, 0, height, pPixels, (BITMAPINFO*) &bminfoheader, DIB_RGB_COLORS)) // load pixel info 
{ 
    //return if fails but first delete the resources 
    DeleteObject(hBmp); 
    delete [] pPixels; // delete the array of objects 

    return false; 
} 

int x, y; // fill the x and y coordinate 

unsigned char r = pPixels[(width*y+x) * 4 + 2]; 
unsigned char g = pPixels[(width*y+x) * 4 + 1]; 
unsigned char b = pPixels[(width*y+x) * 4 + 0]; 

//clean up the bitmap and buffer unless you still need it 
DeleteObject(hBmp); 
delete [] pPixels; // delete the array of objects 

так короче, lpvBits из параметров является указателем на пиксели , но если это только один пиксель вам нужно, я предлагаю использовать GetPixel для