问题标签 [hbitmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2799 浏览

c - 显示 HBITMAP

我先道歉;我是c新手,我真的不知道自己在做什么。

我正在尝试使用 Windows 7 和 c 捕获并显示屏幕截图。我知道这听起来很愚蠢,最终我将在不同的程序中需要这些功能中的每一个,捕获屏幕的那个会将图像发送到显示它的那个,但现在我只是想让它们都在一个程序中工作. 这是我到目前为止整理的代码:

我只是找不到任何显示 HBITMAP 的方法。如何显示 HBITMAP?

更新:我添加了 DrawBitmap 但它不起作用......我得到以下输出,但不知道如何处理它:

'win_screenshot.exe':已加载 'C:\Users\mbrooker\Documents\Visual Studio 2010\Projects\win_screenshot\Debug\win_screenshot.exe',已加载符号。“win_screenshot.exe”:已加载“C:\Windows\SysWOW64\ntdll.dll”,找不到或打开 PDB 文件“win_screenshot.exe”:已加载“C:\Windows\SysWOW64\kernel32.dll”,找不到或打开 PDB 文件“win_screenshot.exe”:加载“C:\Windows\SysWOW64\KernelBase.dll”,找不到或打开 PDB 文件“win_screenshot.exe”:加载“C:\Windows\SysWOW64\user32.dll” , 无法找到或打开 PDB 文件 'win_screenshot.exe': 已加载 'C:\Windows\SysWOW64\gdi32.dll', 无法找到或打开 PDB 文件 'win_screenshot.exe': 已加载 'C:\Windows\SysWOW64\ lpk.dll', 无法找到或打开 PDB 文件 'win_screenshot. 已加载符号。“win_screenshot.exe”:已加载“C:\Windows\SysWOW64\imm32.dll”,找不到或打开 PDB 文件“win_screenshot.exe”:已加载“C:\Windows\SysWOW64\msctf.dll”,找不到或打开 PDB 文件“win_screenshot.exe”:加载“C:\Windows\SysWOW64\apphelp.dll”,找不到或打开 PDB 文件“win_screenshot.exe”:加载“ImageAtBase0x4ab60000”,加载被包含/排除设置禁用。“win_screenshot.exe”:已卸载“ImageAtBase0x4ab60000”程序“[1480] win_screenshot.exe:Native”已退出,代码为 0 (0x0)。win_screenshot.exe':已加载“C:\Windows\SysWOW64\apphelp.dll”,无法找到或打开 PDB 文件“win_screenshot.exe”:已加载“ImageAtBase0x4ab60000”,已通过包含/排除设置禁用加载。“win_screenshot.exe”:已卸载“ImageAtBase0x4ab60000”程序“[1480] win_screenshot.exe:Native”已退出,代码为 0 (0x0)。win_screenshot.exe':已加载“C:\Windows\SysWOW64\apphelp.dll”,无法找到或打开 PDB 文件“win_screenshot.exe”:已加载“ImageAtBase0x4ab60000”,已通过包含/排除设置禁用加载。“win_screenshot.exe”:已卸载“ImageAtBase0x4ab60000”程序“[1480] win_screenshot.exe:Native”已退出,代码为 0 (0x0)。

0 投票
1 回答
738 浏览

c++ - 将现有 HBITMAP 重置为桌面背景 (Win32)

我希望在桌面上创建一个透明窗口。
为此,我创建了一个具有桌面背景的 HDC(创建了桌面的 HBITMAP 并将其应用于我的 HDC),并调用了 UpdateLayeredWindow

到现在为止还挺好。
对于性能问题,我需要保留一个持久的 GDI+ 对象,这意味着我的 HDC 和 HBITMAP 需要在绘画之间保持相同的句柄(假设桌面 DC 没有改变),与这个问题相同。

在第一次绘画迭代中一切顺利。在第二次绘画迭代中,由于 HDC 和 HBITMAP 没有改变,我在现有的 HDC 上重新绘画,这意味着我得到了双图像(背景没有被擦除)。

这是我正在做的代码示例:

有任何想法吗?

0 投票
2 回答
9630 浏览

winapi - 使用 Windows GetDIBits 函数获取位图像素值

我正在尝试使用 GetDIBits 函数获取位图的像素。由于我没有研究过 Windows GDI/API,我对第一个论点 HDC 非常不确定。我在 SO 和网络上搜索了无数帖子,但无法找到有关如何在这种特定情况下初始化 HDC 的信息或示例。这是我读取像素值的程度:


解决方案:

在网上搜索了一些之后,我已经能够拼凑出以下内容:

0 投票
1 回答
73 浏览

c++ - 当我使用 DC 时,我是否应该总是在使用新对象完成工作后替换默认对象

我只是使用创建的临时 DC:

然后我在这个临时 DC 上画了一些图像。我想在这个 DC 中获取图像,所以我CreateCompatibleBitmap()用来创建一个临时位图并用于在 DCSelectObject()中获取原始图像HBITMAP

DeleteDC()现在只想在用完原始位图后,删除原始位图。

这是错的吗?

当我使用 DC 时,我是否应该总是在新对象完成工作后替换原始对象?

0 投票
2 回答
4480 浏览

c# - 将位图从 C# 传递到 C++ 非托管代码

我试图在 C# 中编写代码以将位图传递给非托管 c++ DLL 并返回 POINT 结构,但没有成功。

我在互联网上做了很多研究,但没有找到“Gotcha”文章或一段代码来帮助我解决我的问题。

到目前为止,我能想到的最好的方法是一个非托管 c++ DLL,用托管 c++ dll 包装,由我的 C# 应用程序调用。在测试中,我可以传递简单的类型,例如整数并毫无问题地返回整数。现在对于我遇到的问题,位图。

我尝试传递 HBITMAP(在 c# 中使用我的位图的 GetHBitmap() 函数),但在编译“无法将参数 1 从 'System::IntPtr' 转换为 'HBITMAP'”和“Class1.FindImage( void *, void *) 由于其保护级别而无法访问”。

这是我的一些代码:

主应用:

进口包装.h:

导入包装.cpp:

ImgFuncs.h

ImgFuncs.cpp

我做错了什么,还是我的方法完全偏离了地图?我很乐意接受有关正确编码我正在尝试做的事情的任何建议。我有一些 C++ 代码,用于在另一个运行速度非常快的图像中查找图像。不幸的是,即使在 c# 中使用 lockbits,它也不够快。所以我想利用 c++ 代码进行图像搜索。

我相信我会遇到更多的障碍,但如果我能克服这个绊脚石,我可能会处理它。如您所见,我的 C++ 知识有限。

0 投票
1 回答
283 浏览

video - 从 IGraphBuilder 获取 HBitmap

我正在尝试从 IGraphBuilder 编码视频,为此我需要一个 HBitmap 我可以这样做吗?

PS 我知道 IGraphBuilder 已经有一个 RenderFile 函数,但是这对我来说太慢了,我也更喜欢在 H264 中渲染

0 投票
0 回答
2500 浏览

c# - 将 HBitmap 转换为保留 Alpha 通道的位图

我一直在GoogleStack Overflow中搜索,但找不到有效的示例。

我需要将 HBitmap 转换为托管 .NET 位图,但以下代码不保留 alpha 通道

在 SO 中找到了这个答案,但它对我不起作用,该示例保留了透明度,但是它将我的图像在 Y 轴上翻转了 180º 并将其旋转了 180º。我不知道为什么。

This other example似乎有效,但它是C++

有人在 C# 中工作,而且非常重要,没有内存泄漏?

提前致谢。


编辑:关于@Hans Passant 的评论,我使用以下代码获取 HBitmap(这是从操作系统(仅 Vista 和 Win7)获取缩略图或图标的 shell 调用。

0 投票
1 回答
743 浏览

qt - 删除放置在 QLabel 中的 HBitmap

我的 Qt GUI 上有一系列QLabel对象,我用 HBITMAP 对象填充它们。这些 HBITMAP 是内存中的缓冲区,它们不存在于磁盘上。

现在我使用QPixmaps fromWinHBITMAP to create aQPixmap which I can then pass to theQLabel ssetPixmap` 函数。

现在,问题是,当我用另一个覆盖它时,QLabel 中的当前图像会发生什么,它会留在内存中吗?它会被删除吗?

我怀疑它没有被正确删除,因为我的程序在运行大约一个小时后增长到巨大的比例。(1.7GB) 内存。

进行转换的代码是:

0 投票
3 回答
3940 浏览

c++ - 从 jpeg 内存缓冲区创建 HBITMAP?

我想从 JPEG 格式的字节数组创建 HBITMAP。

我已经搜索过,但我只能从位图文件创建它

有人可以告诉我怎么做吗?

0 投票
1 回答
3423 浏览

c++-cli - 从 HBITMAP 创建位图 (.NET)

我正在使用 C++/CLI 并且我有一个 rawHBITMAP调用hStrip,我必须在 a 中显示它PictureBox,所以我找到了以下函数System::Drawing::Image::FromHbitmap,但是这需要我想知道在传递它之前IntPtr是否需要将我的 raw 转换HBITMAP为或者我是否需要IntPtr可以像这样通过它吗?

如果我需要转换,我应该如何转换?我还没有真正找到这种转换方式。不过,我确实找到了另一种方式。