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++ 中的位图操作的主要内容,如果未能解决你的问题,请参考以下文章

将位图 (bmp) 转换为具有透明度的 png (Windows c++)

c++:如何使用 sdl 将位图加载到 opengl 中的多维数据集中?

Windos Server 2016环境单机环境weblogic12.1.3安装部署

使用 libjpeg / C++ 从文件中提取 JPEG 编码位图 (BMP) 图像

Windoes下安装配置flutter环境

如何在 C++ 中绘制纹理/位图的区域?