问题标签 [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 投票
2 回答
6467 浏览

gdi+ - 如何使用 GetHBITMAP 方法?

我有一个 gdi+ 位图,我想将位图转换为 HBitmap。我编写以下代码。

但它不起作用,我怎样才能获得 HBitmap?

0 投票
1 回答
6654 浏览

c++ - C++/Win32:如何从 HBITMAP 中获取 alpha 通道?

我有一个HBITMAP包含 alpha 通道数据。我可以使用::AlphaBlendGDI 函数成功渲染它。

但是,当我调用::GetPixelGDI 函数时,我永远不会返回带有 alpha 分量的值。文档确实说它返回像素的 RGB 值。

有没有办法检索像素中的 alpha 通道值HBITMAP

我希望能够检测何时使用 ::AlphaBlend,以及何时使用老式方法将源 HBITMAP 中的特定颜色视为透明。



回答

使用 GetDIBits 检索图像的第一条(或更多条)扫描线:

0 投票
1 回答
1881 浏览

gdi+ - GDI+到GDI之间转换的奇怪问题:Bitmap和HBitmap

我想将 gdi+ Bitmap 转换为 gdi 对象 HBitmap。

我正在使用以下方法:

img 对象正在对话框上绘制。当这部分方法被调用时,奇怪的事情发生了!窗口中显示的img改变了!它变得更清晰或更锐利。我的问题是会发生什么?

0 投票
2 回答
6311 浏览

c++ - 在 C++ 中从 HBITMAP 转换为 Jpeg 或 Png

有谁知道我如何使用 HBITMAP 变量来编写 png 或 jpeg 文件?

我首先考虑使用 GDI+ 执行此操作,但它给了我错误,告诉我 min/max 尚未定义(定义它们只会带来更多问题),然后我查看了 libpng 的 C++ 绑定(png++)并且无法获得示例编译。

谢谢,

米奇

0 投票
2 回答
2284 浏览

c++ - 如何在win32中更改工具栏按钮的位图?

我在一个窗口中使用 ReBar 创建了一个带有一些控件的工具栏。谁能告诉我,

  1. 如果我(仅)知道它的 Id,如何获取按钮/组合框/等(不是窗口中的普通按钮)的 HWND?
  2. 如果我知道资源的 ID,如何获取 HBITMAP?
  3. 如何将位图设置到控制器?

    SendDlgItemMessageW(hWnd, nId, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);

这不适用于工具栏,不是吗?我找不到方法,请帮助我。谢谢...

问候

编辑:有人请吗?:(

编辑:好的。这些天似乎每个人都很忙。:(顺便说一句,这是一个错误的问题吗?

0 投票
1 回答
840 浏览

c# - 在 C# 中使用 HBITMAP 句柄检索远程位图

我有一个MarshalByRefObject我需要序列化和存储(在数据库中)的,所以我可以在以后反序列化和引用它。我选择了不同的方法:现在我正在运行一个 Windows 服务,它只是保持MarshalByRefObjects“活动”(请注意,RemoteObject它实际上是一个第 3 方对象,我不是自己创建的):

在另一个 AppDomain 中,我只需连接并检索对象;一切正常:

现在的问题是RemoteObject包含一个属性,它只是一个HBITMAP转换为类型的句柄long。我可以轻松地取回手柄。通常(本地)我会这样做:

这在当前情况下不起作用。我得到一个System.Runtime.InteropServices.ExternalException我猜问题是hbitmap本地AppDomain中不存在的一些内存的句柄,但在Windows服务AppDomain中。我的问题是我的选择是什么:

  • RemoteObject是相当复杂的,它就像一棵树,您可以通过调用它的函数来遍历节点。第三方强制我只能遍历对象一次。所以在服务端遍历它,将位图存储在数据库中,然后再次远程遍历它是行不通的。
  • 理想的情况是能够调用 Windows 服务中的函数,并将 hbitmap 句柄作为参数传递,返回实际的位图。这在 Windows 服务中是不可能的。
  • 我可以将句柄存储在数据库中,并让 Windows 服务轮询数据库。然后它可以检索位图并将其存储在同一个数据库中。然后我可以再次远程检索该位图。这非常难看,因为我需要立即使用位图。

基本上我想知道你是否有建议不必像第三个选项那样执行丑陋的黑客攻击......我有什么选择?

已解决 现在我通过创建一个自定义对象来解决问题,该对象在服务端扩展 MarshalByRefObject。该对象具有通过传递句柄来检索和保存位图的方法。我只是远程接近对象,就像接近我的第 3 方对象一样。解决方案太简单了,尽管有同事不得不指出。

0 投票
2 回答
519 浏览

c++ - 为什么 HBITMAP 是倒置的

我正在尝试为给定的 jpg 图像创建一个 avi 文件。我正在使用库阅读 jpg 并为它准备 hbitmap。最后我添加它来创建 avi 文件。但我最终的 avi 文件包含倒置的图像。我对位图标题中的高度保持消极。我的 hbitmap 仍然是倒置的。你能帮忙解释一下错误的原因吗

在这里,我给出了我实现的代码

提前致谢

0 投票
3 回答
319 浏览

c++ - 我可以删除在另一个进程中创建的 HBITMAP 对象吗?

我正在创建一个实用程序,它使用全局挂钩将一些(用户可自定义的)图标绘制到桌面上的其他窗口上。由于位图对象特定于一个进程,因此在绘制它们之前,我在每个进程中为这些图标创建单独的 HBITMAP 对象,并且所有这些句柄都存储在 dll 的共享段中。

现在,当我的程序中(由用户)删除一个图标时,应该删除这些不同进程中它的所有 HBITMAP 对象。我可以在我的主程序中使用 DeleteObject() 执行此操作,还是必须在创建它的过程中删除每个句柄?

0 投票
3 回答
24320 浏览

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

我有一个应用程序可以从数据库中加载一些 blob 数据,这些数据可以表示各种位图和图标的 png 格式或原始二进制数据。这被存储在一个std::vector<unsigned char>

我正在使用CImageList对象在树视图、工具栏图像等中显示各种图像,但问题是从内存中的数据创建位图变得模糊,就像在执行以下操作时丢失像素一样:

为了暂时解决这个问题,我只是将向量中的 data() 写到一个临时文件中,然后使用 LoadImage 将其读回并从中创建 HBITMAP。这非常有效,但是这无疑是一种无耻的黑客行为,我希望完全没有必要。

我在网上环顾四周,但没有找到任何关于如何“正确”从内存中创建 hbitmap 的非常好的例子。我希望能够创建这些位图以添加到图像列表中,而无需任何文件 i/o,并且如果可能的话,复制数据的数量有限。

寻找最好的方法来做到这一点,显然 Windows 特定的代码很好。

更新:

根据 jdv 的回答,我开始使用 CreateCompatibleBitmap、CreateDIBitmap,最后是 CreateDIBSection。所有这些最终都创建了可爱的黑色位图而不是以前的模糊位图,所以我一定又做错了,我的猜测是因为这个位图创建是在一个没有屏幕直流或窗口概念的对象中完成GetDC(NULL)CreateCompatibleDC(NULL)都不好。示例代码:

我现在当然认为必须有一种更简单的方法来解决这个问题,也许完全避免 HBITMAP 并直接与CBitmap类一起工作?当归结为将图像添加到CImageList我正在使用的图像时CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask)。有谁知道CBitmap从 a 初始化对象的简单方法std::vector<unsigned char>

0 投票
3 回答
6661 浏览

c# - 在 C# 中使用本机 HBitmap,同时保留 Alpha 通道/透明度

假设我从本机 Windows 函数中获得了 HBITMAP 对象/句柄。我可以使用Bitmap.FromHbitmap(nativeHBitmap)将其转换为托管位图,但如果本机图像具有透明度信息(alpha 通道),则此转换会丢失它。

Stack Overflow 上有几个关于这个问题的问题。使用这个问题的第一个答案(如何使用 GDI+ 绘制 ARGB 位图?)中的信息,我编写了一段我尝试过的代码并且它可以工作。

它基本上使用GetObjectBITMAP结构获取本机 HBitmap 的宽度、高度和指向像素数据位置的指针,然后调用托管的 Bitmap 构造函数:

据我了解(如果我错了,请纠正我),这不会将实际像素数据从本机 HBitmap 复制到托管位图,它只是将托管位图指向来自本机 HBitmap 的像素数据。

而且我不会在另一个图形(DC)或另一个位图上绘制位图,以避免不必要的内存复制,特别是对于大位图。

我可以简单地将这个位图分配给 PictureBox 控件或 Form BackgroundImage 属性。它工作正常,位图正确显示,使用透明度。

当我不再使用位图时,我确保 BackgroundImage 属性不再指向该位图,并且我同时处置托管位图和本机 HBitmap。

问题:你能告诉我这个推理和代码是否正确。我希望我不会得到一些意想不到的行为或错误。我希望我能正确释放所有内存和对象。