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

c - 仅使用 Win32 将 HBITMAP 保存到 *.bmp 文件

我的纯 Win32 项目中有一个 HBITMAP(不使用外部库)。我可以只使用 Winapi 和/或 CRT 函数将它导出到 *.bmp 文件,这样我就不必向项目添加依赖项了吗?

0 投票
0 回答
300 浏览

winapi - 为什么在 WM_MOUSEMOVE 中重复调用 createBitmapIndirect 最终返回 NULL?

我正在编写一个复杂的颜色编辑对话框,其中包含一个列表视图控件和一个 Photoshop 样式的 HSV 颜色选择器。该对话框将按描述使用:用户首先单击特定项目,然后操纵颜色选择器上的光标为项目设置正确的颜色,然后单击另一个项目并重复该过程。

我的 hotoshop stle HSV 颜色选择器分为两个矩形 - 1. 256x20 色带,代表完整的 360 跨度 HUE

  1. 256x256 窗口,显示当前选定 HUE 的所有 VALUES 和 SATURATION 变化。

实现:我做了一些研究并决定使用 GDI 位图。所以我填写GDI BITMAP struct,获取dc,获取comaptable dc,并通过CreateBitmapIndirect 创建hBitmap:

然后在鼠标移动时,我必须检查用户是否在色调渐变中选择了其他 HUE,如果他选择了,那么我需要用新值填充我的 BITMAP 的字节数组。在列表中,为简单起见,每次鼠标移动都需要更改 HUE 并在每次调用时重新填充整个位图。

它适用于 40 或 50 次第一次调用,但随后所有窗口滞后并失去 DC,我可以移动窗口,但该区域不刷新。我的停止标记显示 hBitmap=CreateBitmapIndirect(...) 的问题,显示 0x00000000 和 GetLastError 显示 0;

现在的主要问题是我做错了什么?

0 投票
1 回答
82 浏览

c++ - 在 C++ 中管理我的对象时内存分配的逻辑问题

我的功能设计有一些问题,我没有找到合适的解决方案(我是 C++ 的初学者)。

几天前,我问了另一个与此相关的问题。

所以,我有一个功能可以进行屏幕截图。它完美地工作。事实是我希望这个函数Image从我实现的类中返回一个对象。

基本上,它是:

我的功能是这样的:

bitPointer创建的usingCreateDIBSection实际上是指向我的第一个像素值的指针(如果我理解得很好的话)。

然后,我可以使用一个简单的循环:

这是我的问题。

我必须hBitmap通过调用来释放,DeleteObject(hBitmap)否则我将没有更多的内存空间(循环最终崩溃)。

但是,我不知道在哪里做。

我想在我的函数中执行此操作,但如果我调用DeleteObject(),那么它也会破坏我的bitPointer,因此我将无法从Image返回的对象中访问像素。事实上,我对我的bitPointer变量是指针这一事实有点困惑。这意味着我不能复制它以防止它被破坏。我找不到解决方案。

我尝试过的两种解决方案:

  • 创建一个调用DeleteObject()我的类的析构函数Image
    它不起作用,因为析构函数是从函数调用的,而不仅仅是从我的循环内部调用的。
  • HBITMAP hBitmap向我的 class添加一个属性Image,并DeleteObject()从我的循环内部调用。
    这不是很方便,而且我必须声明一个新的 Image 对象,我不能像我写的循环那样匿名。

所以,我被卡住了,有人可以帮我吗?

0 投票
1 回答
128 浏览

visual-studio-2010 - 使用 HBitmap

我正在尝试将一些 HBITMAP 保存到一个数组中,并在以后显示它们。从 DC 创建 HBITMAP 是可行的,但是当我尝试显示保存的 HBITMAP 时,我似乎弄错了。这让我觉得我还没有真正理解 HTBIMAP 是如何存储在内存中的。我假设数据类型 HBITMAP 本质上是指向内存中对象的指针,这就是我所需要的,但也许还有更多?

这是一个示例代码:

因此,这个想法本质上是将 HBITMAP 指针推送到一个数组,然后通过将任何存储的图像选择到内存 DC 中然后将其复制到实际 DC 来显示任何存储的图像。这有什么问题?

我使用的是 VC++、Visual Studio 2010,没有 MFC。

编辑:

我又做了一些测试。为了调试,我尝试通过添加以下for循环来显示所有存储的位图(位置偏移)SaveScreen

然后它会显示iNumBitMaps图像的时间,但它始终是相同的图像(即我存储在 中的图像aBitMaps[0])。我确实在调试器中进行了验证,它aBitMaps包含所有不同的指针。所以,不知何故,我认为我没有正确地将位图加载到内存 DC 中。

0 投票
1 回答
1848 浏览

c++ - 从 HBITMAP 获取特定像素的 RGB 值

如何从 HBITMAP 中获取一个特定像素的 RGB 值?我尝试在 StackOverflow 上阅读类似的帖子,但没有一个真正适合这个问题。下面的代码似乎获得了 HBITMAP 中另一个位置(不是想要的位置)的 RGB 值。

编辑(使用 user1118321 的解决方案)

height-1 因为 y 从 0 而不是 1 开始。

0 投票
1 回答
807 浏览

c# - 除了使用 P/Invoke 之外,如何在 hBitmap 上调用 DeleteObject()?

我正在处理类似这样的代码(从这里

并且 MSDN 说,每当我打电话时,Bitmap.GetHbitmap()我都必须调用DeleteObject()hBitmap释放非托管资源。

我见过的所有答案和 MSDN 都说我必须 P/Invoke 该DeleteObject()功能。这看起来有点疯狂,因为我获得了hBitmap没有 P/Invoke,现在我突然需要使用 P/Invoke 来正确摆脱它。

除了 P/Invoke 确实没有其他方法可以DeleteObject()调用我的hBitmap吗?

0 投票
0 回答
738 浏览

c++ - 如何在 C++ 中将文本添加到我的位图文件

使用下面的代码示例,我成功创建了一个 .bmp 文件,打开该文件时只显示一个灰色方块。现在我想在保存之前将文本添加到位图中。例如:绿色的“Hello World”应该显示在灰色方块的顶部。这里的stackoverflow帖子是我迄今为止发现的最接近的东西。不幸的是,我仍然无法弄清楚完整的实现。

请注意,我想避免使用任何第三方库。任何帮助将不胜感激,谢谢。

0 投票
1 回答
903 浏览

c++ - 转换矢量到 C++ 中的 HBITMAP

我已使用此处的代码将 PNG 图像加载到 BMP 原始矢量std::vector <unsigned char>中。现在,我需要将此图像作为背景应用到 WinAPI 窗口,但我不知道如何将其转换为HBITMAP. 也许有人以前做过,或者我可以使用另一种格式或变量类型

0 投票
1 回答
1135 浏览

c++ - 如何在不使用 BitBlt 的情况下提取 HBITMAP 的一部分

我有一个 HBITMAP 对象。在不使用 BitBlt 的情况下,我想将它分成几部分并获得这些部分的位或新位图

我可以用 BitBlt 做到这一点,但它很慢。提取零件大约需要 50 毫秒。我考虑过从位图中提取字节数组的区域,但这似乎很困难。还有其他方法吗?

谢谢!

0 投票
0 回答
54 浏览

c++ - 将 jpeg 从 hBitmap 保存到 BYTE 数组

在此先感谢您的帮助 :)

在我的代码中,我从本地计算机加载位图,最终接收到 HBITMAP 结构。我想将此 hBitmap 转换为 JPEG 并将其发送到远程服务器端套接字。

到现在为止,我能做到的就是通过CImage功能将我的图片以jpg格式保存在磁盘上,然后通过网络发送。但是,我想干净利落地完成它,而不是在磁盘上写入临时文件。我的第一个想法是发送 JPEG 数据的字节数组,但我不知道该怎么做......有什么想法吗?

以下是我用来生成 JPEG 文件的代码片段。

非常感谢您的帮助。