Windows 上 C++ 中的位图操作
Posted
技术标签:
【中文标题】Windows 上 C++ 中的位图操作【英文标题】:Bitmap manipulation in C++ on Windows 【发布时间】:2010-03-17 19:01:54 【问题描述】:我自己有一个位图句柄,用 C++ 编写,在 Windows 上:
HBITMAP hBitmap;
在这张图片上,我想做一些图像识别、模式分析之类的事情。在我在大学的学习中,我在 Matlab 中完成了这项工作,根据它们的位置很容易获得单个像素,但我不知道如何在 Windows 下的 C++ 中做到这一点——我真的无法做到了解我到目前为止所读到的内容。我已经看到一些对漂亮的 Bitmap 类的引用,它可以让你 setPixel() 和 getPixel() 之类的东西,但我认为这是 .net 的。
我应该如何将我的 HBITMAP 变成我可以轻松玩的东西?我需要能够获得 RGBA 信息。是否有库让我无需了解 DC 和 BitBlt 之类的东西就可以处理数据?
【问题讨论】:
我刚刚得到了在 C 中生成位图的闪回 msdn.microsoft.com/en-us/library/dd183377(VS.85).aspx 可能会给你一些想法。 【参考方案1】:您可以使用 OpenCV 库作为完整的图像处理工具。
您也可以使用 MFC 的 CImage
或 VCL 的 TBitmap
来从 HBITMAP
中提取像素值。
【讨论】:
这个库看起来对我来说非常有用,不仅仅是这个问题中的问题。【参考方案2】: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
【讨论】:
【参考方案3】:使用来自 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+。 GetPixel在GDI中的表现如何?我知道它在 GDI+ 中很糟糕,而且任何严肃的图像处理都可能足够密集,需要直接访问内存。循环遍历图像的位真的不是那么难或容易出错。【参考方案4】:与:
DIBSECTION ds;
::GetObject(hbmp/*your HBITMAP*/, sizeof DIBSECTION, &ds);
您将在 ds.dsBm 中获得所需的一切(包括像素格式和像素缓冲区地址)。 见the doc
【讨论】:
以上是关于Windows 上 C++ 中的位图操作的主要内容,如果未能解决你的问题,请参考以下文章
c++:如何使用 sdl 将位图加载到 opengl 中的多维数据集中?