问题标签 [getdibits]

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 回答
6654 浏览

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

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

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

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

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



回答

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

0 投票
1 回答
1426 浏览

delphi - Inscriber 技术通过 Builder 和 Delphi - Alpha 通道支持

我正在与 Inscriber Technology 的 Via Builder 合作。此应用程序将 TGA 序列动画合并到一个 .via 文件中,从而更好地加载大型序列,因为此文件已优化。有一些插件可以将其与某些 Adob​​e 产品一起使用。

我正在研究 Delphi,我的问题是我无法从帧中取回原始的 alpha 通道。使用他们的 VIACODECLib_TLB 库,我有以下功能:

来自 IViaFile 接口。这个函数应该从原始序列返回一个帧位图的句柄。以下代码可以工作:

但生成的位图是没有 Alpha 通道的原始帧。实际上,整个图像的 alpha 通道为零。

假设我做错了什么,我尝试使用 GetDIBits 函数,以确保某处有一个 alpha 通道。所以我分配了足够长的内存来存储位图,假设它有 4 个通道并使用 GetDIBits 函数。我得到了和以前一样的结果:正常帧,整个图像的 alpha 通道为零。

请注意,Inscriber(其论坛已死)声称其 Via Builder 具有完整的 alpha 支持。我知道有人设法在 C++ 上使用 GetDIBits 函数正确加载帧,但是将代码“翻译”为 Delphi 不起作用。

任何帮助将非常感激。

谢谢你。

0 投票
2 回答
4149 浏览

c++ - 使用 Winsock、GetDIBits 和 SetDiBits 传输位图

我开始研究类似于 C++ 中的远程控制应用程序的东西。我希望将特定窗口的屏幕截图传输到另一台 PC 并在窗口中显示。GetDIBits 和 SetDIBits 函数都成功,连接建立,数据发送,但图像并没有出现在另一边,只是一片黑。

这是我的发送代码:

这是接收方:

我在这里提供的代码有点长,因为我不确定什么可能有用。先感谢您。

0 投票
5 回答
20454 浏览

c++ - GetDIBits 并使用 X、Y 遍历像素

我正在抓取屏幕的一部分并通过像素扫描特定颜色范围。

我查看了MSDN 的 Capturing an Image示例并知道如何使用这些功能。

我可以将这些位放入一个数组中,但我不确定如何以一种可以像循环图像一样循环的方式来完成它。一个伪示例(我确定这很遥远):

这基本上就是我想要做的,所以如果红色、蓝色和绿色是某种颜色,我就会知道它在图像中 (x, y) 的坐标。

我只是不知道如何以这种方式使用 GetDIBits,以及如何适当地设置数组以实现这一点。

0 投票
1 回答
1630 浏览

gdi - GetDIBits 中的 HDC 是什么?

GetDIBits用来将位图数据从屏幕兼容的设备上下文中获取到某种格式的 DIB 中。我的印象是,当源位图为每像素 8 位或更少时,DC 仅用于合成颜色表。由于我的源位图是一个完整的 32 位彩色图像,而且这是一个一次性程序,而且我没有方便的屏幕 DC,我将 HDC 参数设置为 NULL。这没有用。一旦我抓住屏幕 DC 并将其传递进去,它就开始工作了。

这让我想知道为什么GetDIBits需要设备上下文。它是干什么用的?

0 投票
1 回答
669 浏览

bitmap - 使用 BITMAP::bmBits 与 GetDIBits 有什么区别?

我刚刚意识到BITMAPGDI 中存在,然后您GetObject(hBmp, sizeof(BITMAP), &bmp);几乎在所有GetDIBits示例中都这样做。但是这里新填充的 bmp 有一个字段:bmBits

如果我这里已经有位图的位,我为什么还要GetDIBits再打电话?

谢谢,阿里维利

0 投票
1 回答
260 浏览

winapi - 需要与设备无关的位图位

我正在用 C++ 构建一个要导入 VB 项目的 dll。dll 公开了一个函数,该函数将通过 Win Shell 提取指定文档的预览图像,然后将其写入缓冲区以供 VB 应用程序使用。

到目前为止,我能够毫无问题地获得 HBITMAP 句柄。我还能够使用 GetBitmapBits 函数提取位图数据。但是,这不起作用,因为需要位数据的对象需要它是与设备无关的格式。

我读过 GetDiBits 是用于此目的的函数,但我很难弄清楚如何成功调用该函数。

我应该使用什么设备上下文?另外,如何确保它以独立于设备的格式写出数据?

提前致谢。

0 投票
2 回答
9630 浏览

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

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


解决方案:

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

0 投票
0 回答
1185 浏览

delphi - 尝试将 TBitmaps 写入 AVI 文件并仅获取黑帧(全零数据)

我有一个 Delphi 应用程序,它从文件中读取 JPEG 帧并将它们写入 AVI 文件。每个 JPEG 帧都被解码为一个 TBitmap 对象,然后使用由用于 AVI 操作的 Windows API DLL (AVIFIL32.DLL) 提供的服务,通过 Delphi 6 VFW.PAS 单元写入一个输出 AVI 文件。

问题是我最终在输出文件中出现了所有黑框。我知道在调用 AVIStreamWrite() 之前用作源的 TBitmaps 具有有效数据,因为我已使用 TBitmap.SaveToFile() 方法将它们写入磁盘并且源图像看起来很好。但我仍然以黑框结束。我从 TBitmap 获取位的方式有问题,因为如果我检查它指向的内存区域,GetDIBBits() 返回的指针显示所有零。

下面是我的代码。我究竟做错了什么?此外,如果我尝试释放 CreateDIBSection() 返回的第一个 pBits,我会遇到访问冲突。这是正常的还是有一些适当的方法可以释放它?

0 投票
1 回答
915 浏览

c++ - 使用 GetDIBits 访问图像的像素颜色

我可以使用 GetDIBits 加载当前窗口的颜色内容,但我不知道如何从某个位置加载图像的颜色。有人可以告诉我该怎么做吗?

我以这种方式将颜色加载到数组中

我是 Windows 编程新手,只想知道如何将图像加载到 hdc 上。

正如雷蒙德建议的那样,我将第二个参数传递为

我仍然只捕获活动窗口的颜色而不是图像的颜色。我如何更改设备句柄以反映这一点。