c++ 从 hbitmap 获取原始像素数据

2023-11-24

我对使用 p/invoke 调用相当陌生,想知道是否有人可以指导我如何从 hbitmap 检索原始像素数据(unsigned char*)。

这是我的场景:

我正在加载一个.NET 位图对象在C#侧并将其 IntPtr 发送到我的非托管 C++ 方法。一旦我收到 hbitmap ptrC++另一方面,我想访问位图的像素数据。我已经制作了一个接受 unsigned char* 的方法,它表示来自 c# 的原始像素数据,但是我发现从 c# 中提取 byte[] 相当慢。这就是为什么我想发送 Bitmap ptr,而不是将 Bitmap 转换为 byte[] 并将其发送到我的 C++ 方法。

获取 Bitmap IntPtr 的 C# 代码

Bitmap srcBitmap = new Bitmap(m_testImage);
IntPtr hbitmap = srcBitmap.GetHbitmap();

用于导入 C++ 方法的 C# 代码

[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDll.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int ResizeImage(IntPtr srcImg);

将接收 Hbitmap 处理程序的 C++ 方法

int Resize::ResizeImage(unsigned char* srcImg){
    //access srcImgs raw pixel data (preferably in unsigned char* format)
   //do work with that 
   return status;
}

问题:

1) 由于我要发送 IntPrt,我的 C++ 方法参数可以是 unsigned char* 吗?

2)如果没有,我如何从c++访问位图的原始数据?


The GetHbitmap方法不检索像素数据。它产生一个 GDI 位图句柄,类型为HBITMAP。您的非托管代码会将其作为类型参数接收HBITMAP。您可以使用 GDI 调用从中获取像素数据。但它本身并不是原始像素。

事实上,我很确定您正在以错误的方式解决这个问题。你可能正朝这个方向走,因为GetPixel and SetPixel很慢。这是千真万确的。事实上,他们的 GDI 同等产品也是如此。你需要做的是使用LockBits。这将使您能够以有效的方式在 C# 中操作整个像素数据。可以在这里找到对该主题的详细描述:https://web.archive.org/web/20141229164101/http://bobpowell.net/lockingbits.aspx。请注意,为了提高效率,这是一种 C# 代码,其中不安全代码和指针通常是最佳解决方案。

如果出于某种原因,您仍然希望使用 C++ 代码操作像素数据,那么您仍然可以使用LockBits作为获取像素数据指针的最简单方法。它肯定比非托管 GDI 等价物容易得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 从 hbitmap 获取原始像素数据 的相关文章

随机推荐

  • 将 Bootstrap 5 与 Vue 3 结合使用

    我想将 Bootstrap 5 与 Vue 3 结合使用 由于 Bootstrap 5 使用普通 JS 无 JQuery 我可以直接在 Vue 3 项目中使用 Bootstrap 5 不使用 Bootstrap Vue 吗 有人可以指导我如
  • 为什么示例中的 Bootstrap 5 中的折叠不起作用?

    我尝试使用引导崩溃 我复制了该示例 但单击按钮时没有任何反应 不知道出了什么问题 我认为 js 无法正常工作
  • .NET 列表视图刷新

    我有以下代码 它基本上从数据库中获取值并填充列表视图 using IDataReader reader cmd ExecuteReader lvwMyList Items Clear while reader Read ListViewIt
  • 为什么在 PHP 中使用“use”关键字来导入核心标识符?

    有时在一些图书馆 比如thephpleague csv 我看到use关键字来导入核心标识符 例如函数 类或常量 但我根本不明白为什么要导入它们 请参见以下示例 use Generator use SplFileObject use func
  • 谷歌云存储加入多个csv文件

    我将数据集从 Google BigQuery 导出到 Google Cloud Storage 考虑到文件大小 BigQuery 将文件导出为 99 个 csv 文件 然而 现在我想连接到我的 GCP 存储桶并使用 Spark 执行一些分析
  • 即使使用 nohup 子进程也会被杀死

    我在用着subprocess Popen启动多个进程 代码是这样的 while flag gt 0 flag check flag c MyClass num process 10 c launch MyClass如果类似以下内容 MyCl
  • Android MediaMetadataRetriever 从大多数键返回空值

    我想从我的媒体文件 主要是 mp3 中获取信息 但我从我想要的那些值中只得到 null 我已经尝试过所有按键extractMetadata key 我是否跳过 遗漏了某些内容 代码依据 MediaMetadataRetriever f ne
  • 为什么不能对函数的返回值使用数组索引? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 为什么我不能这样做 explode 1 2 3 1 0 所有其他语言都支持它 我
  • rm、cp、mv 命令的参数列表太长错误

    我在 UNIX 的一个目录下有数百个 PDF PDF 的名称非常长 大约 60 个字符 当我尝试使用以下命令一起删除所有 PDF 时 rm f pdf 我收到以下错误 bin rm cannot execute Argument list
  • 如何从 flutter 中的数据快照获取特定值?

    我有这个数据快照 post1 pic https i redd it ni6zhxh874011 jpg title title desc desc post2 pic https i redd it krj9miojg5011 jpg t
  • Firebase 倒计时器在多个客户端之间同步

    我将尝试使用 Angular JS 为特定的利基市场构建一个便士拍卖网站 我正在尝试计划倒计时器 并且我一直渴望尝试一下 firebase 我昨天有一个想法 让每次拍卖在实际数据库中都有一个倒计时 因为通过 2 路数据绑定 人们的客户端将始
  • Xcode 4 和 Interface Builder:编辑垂直间距约束(锚定顶部,而不是底部)

    我有一个小部件在设备上未正确布局 其looks在 IB 中还可以 但不太正确 该小部件是一个标签 位于屏幕中间 Interface Builder 为其提供了带有 底部锚点 的垂直空间约束 在这里 底部意味着屏幕的底部 而不是下面的小部件
  • jQuery 自动完成(远程)- 示例

    我真的希望避免发布新问题 但我找不到 jQuery 自动完成远程功能的功能示例 其中包括调用页面和 搜索 页面 jQueryUI 演示和文档 部分不包含 search php 的源代码 我尝试了数十种组合 但这是我开始的组合
  • 什么是&=和|=

    我正在查看大型代码库中的一些 VC 代码 并发现了以下内容 if nState TOOL TIPS VISIBLE nState TOOL TIPS VISIBLE else nState TOOL TIPS VISIBLE break C
  • 是否有键盘快捷键可以浏览 Jupyter 笔记本中的历史记录

    有没有一种简单的方法可以浏览命令历史记录并在 Jupyter 笔记本中重用旧命令 有些相当于 iPython 控制台中使用的向上 向下箭头或 Mathematica 中使用的 符号 虽然对于专家来说答案可能看起来微不足道 但对于新手来说确实
  • PHP计算目录和子目录中的文件总数函数

    我需要获取指定目录中 JPG 文件的总数 包括其所有子目录 没有子子目录 结构如下 dir1 2 files subdir 1 8 files total dir1 10 个文件 dir2 5 files subdir 1 2 files
  • 多线程还是尽可能少的线程?

    作为一个业余项目 我目前正在为我曾经玩过的一款古老游戏编写服务器 我试图使服务器尽可能松散耦合 但我想知道对于多线程来说什么是好的设计决策 目前我有以下操作顺序 启动 创建 gt 服务器 监听客户端 创建 gt 客户端 监听命令并发送周期数
  • 如何使用用户的默认电子邮件客户端弹出撰写/创建邮件对话框?

    用例很简单 在某个时间点 我需要能够向用户展示他熟悉的撰写电子邮件对话框 Outlook 或其他 发件人 收件人 主题 等字段已填充了某些应用程序确定的值 该电子邮件还会附带一个附件 除非用户明确同意 否则不应发送邮件 我在 VB6 时代做
  • LINQ 中的升序/降序 - 可以通过参数更改顺序吗?

    我有一个给出参数 bool sortAscending 的方法 现在我想使用 LINQ 根据此参数创建排序列表 然后我得到了这个 var ascendingQuery from data in dataList orderby data P
  • c++ 从 hbitmap 获取原始像素数据

    我对使用 p invoke 调用相当陌生 想知道是否有人可以指导我如何从 hbitmap 检索原始像素数据 unsigned char 这是我的场景 我正在加载一个 NET 位图对象在C 侧并将其 IntPtr 发送到我的非托管 C 方法