Манипулирование растровым изображением в 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;
}
Другие вопросы по тегам