在Windows上使用C++进行位图操作

3

我在Windows上用C++获取了一个位图的句柄:

HBITMAP hBitmap;

在这个图像上,我想进行一些图像识别、模式分析等工作。在大学的学习中,我用Matlab做过这个,根据像素的位置很容易获取单个像素,但我不知道如何在Windows下使用C++实现这个功能——到目前为止,我还没有真正理解我所读到的内容。我看到了一些关于一个很好的Bitmap类的引用,它可以让你设置像素和获取像素等操作,但我认为这是使用.net的。

我应该如何将我的HBITMAP转换成可以轻松处理的东西?我需要能够获取RGBA信息。是否有库可以让我在不必学习DC和BitBlt等技术的情况下处理数据?


1
我突然想起以前在 C 中生成位图的情景。 - Carson Myers
http://msdn.microsoft.com/en-us/library/dd183377(VS.85).aspx 可能会给你一些创意。 - Eugen Constantin Dinca
4个回答

5
你可以使用OpenCV库作为完整的图像处理工具。
你也可以使用MFC的CImage或VCL的TBitmap来提取HBITMAP中的像素值。

这个库看起来对我非常有用,不仅仅是在这个问题中。 - Oliver

4
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

2

使用GDI中的GetPixel方法来尝试此操作:

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;
}

以上所有内容都是“直接”GDI而不是GDI+。 - Eugen Constantin Dinca
GDI中的GetPixel性能如何?我知道在GDI+中它很糟糕,任何严肃的图像处理都可能足够强大,需要直接内存访问。遍历图像的位并不难也不容易出错。 - Ed S.

2

使用:

DIBSECTION ds;
::GetObject(hbmp/*your HBITMAP*/, sizeof DIBSECTION, &ds);

你可以在ds.dsBm中获取所需的所有内容(包括像素格式和像素缓冲地址)。请参阅文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接