Манипулирование растровым изображением в C++ в Windows
У меня есть дескриптор растрового изображения в C++ в Windows:
HBITMAP hBitmap;
На этом изображении я хочу сделать распознавание изображений, анализ образцов и тому подобное. Во время учебы в университете я делал это в Matlab, довольно легко получить доступ к отдельным пикселям в зависимости от их положения, но я понятия не имею, как это сделать в C++ под Windows - я действительно не смог понять то, что я прочитал до сих пор. Я видел некоторые ссылки на красивый класс Bitmap, который позволяет вам устанавливать setPixel() и getPixel() и тому подобное, но я думаю, что это с.net .
Как мне превратить мой HBITMAP в то, с чем я могу легко играть? Я должен быть в состоянии получить в RGBA информацию. Существуют ли библиотеки, которые позволяют мне работать с данными, не изучая DC и BitBlt и тому подобное?
4 ответа
Вы можете использовать библиотеку OpenCV в качестве инструмента полной обработки изображений.
Вы также можете использовать МФЦ CImage
или VCL TBitmap
просто чтобы извлечь значения пикселей из HBITMAP
,
Gdiplus::Bitmap* pBitmap = Gdiplus::Bitmap::FromHBITMAP( hBitmap, NULL );
Gdiplus::Color pixel_color;
pBitmap->GetPixel( x, y, &pixel_color ); // read pixel at x,y into pixel_color
// ...
delete pBitmap; // do not forget to delete
С:
DIBSECTION ds;
::GetObject(hbmp/*your HBITMAP*/, sizeof DIBSECTION, &ds);
вы получите все, что вам нужно (включая формат пикселя и адрес буфера пикселя) в ds.dsBm. посмотреть документ
Попробуйте это с помощью GetPixel из GDI:
COLORREF GetBitmapBixel(HBITMAP hBitmap, int xPos, int yPos)
{
HDC hDC = GetDC(NULL);
HDC hMemDC = CreateCompatibleDC(hDC);
COLORREF pixelColor;
HBITMAP hOld = (HBITMAP)SelectObject(hMemDC, hBitmap);
pixelColor = ::GetPixel(hMemDC, xPos, yPos);
SelectObject(hMemDC, hOld);
DeleteDC(hMemDC);
ReleaseDC(NULL, hDC);
return pixelColor;
}