问题标签 [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.
c++ - C++/Win32:如何从 HBITMAP 中获取 alpha 通道?
我有一个HBITMAP
包含 alpha 通道数据。我可以使用::AlphaBlend
GDI 函数成功渲染它。
但是,当我调用::GetPixel
GDI 函数时,我永远不会返回带有 alpha 分量的值。文档确实说它返回像素的 RGB 值。
有没有办法检索像素中的 alpha 通道值HBITMAP
?
我希望能够检测何时使用 ::AlphaBlend,以及何时使用老式方法将源 HBITMAP 中的特定颜色视为透明。
回答
使用 GetDIBits 检索图像的第一条(或更多条)扫描线:
delphi - Inscriber 技术通过 Builder 和 Delphi - Alpha 通道支持
我正在与 Inscriber Technology 的 Via Builder 合作。此应用程序将 TGA 序列动画合并到一个 .via 文件中,从而更好地加载大型序列,因为此文件已优化。有一些插件可以将其与某些 Adobe 产品一起使用。
我正在研究 Delphi,我的问题是我无法从帧中取回原始的 alpha 通道。使用他们的 VIACODECLib_TLB 库,我有以下功能:
来自 IViaFile 接口。这个函数应该从原始序列返回一个帧位图的句柄。以下代码可以工作:
但生成的位图是没有 Alpha 通道的原始帧。实际上,整个图像的 alpha 通道为零。
假设我做错了什么,我尝试使用 GetDIBits 函数,以确保某处有一个 alpha 通道。所以我分配了足够长的内存来存储位图,假设它有 4 个通道并使用 GetDIBits 函数。我得到了和以前一样的结果:正常帧,整个图像的 alpha 通道为零。
请注意,Inscriber(其论坛已死)声称其 Via Builder 具有完整的 alpha 支持。我知道有人设法在 C++ 上使用 GetDIBits 函数正确加载帧,但是将代码“翻译”为 Delphi 不起作用。
任何帮助将非常感激。
谢谢你。
c++ - 使用 Winsock、GetDIBits 和 SetDiBits 传输位图
我开始研究类似于 C++ 中的远程控制应用程序的东西。我希望将特定窗口的屏幕截图传输到另一台 PC 并在窗口中显示。GetDIBits 和 SetDIBits 函数都成功,连接建立,数据发送,但图像并没有出现在另一边,只是一片黑。
这是我的发送代码:
这是接收方:
我在这里提供的代码有点长,因为我不确定什么可能有用。先感谢您。
c++ - GetDIBits 并使用 X、Y 遍历像素
我正在抓取屏幕的一部分并通过像素扫描特定颜色范围。
我查看了MSDN 的 Capturing an Image示例并知道如何使用这些功能。
我可以将这些位放入一个数组中,但我不确定如何以一种可以像循环图像一样循环的方式来完成它。一个伪示例(我确定这很遥远):
这基本上就是我想要做的,所以如果红色、蓝色和绿色是某种颜色,我就会知道它在图像中 (x, y) 的坐标。
我只是不知道如何以这种方式使用 GetDIBits,以及如何适当地设置数组以实现这一点。
gdi - GetDIBits 中的 HDC 是什么?
我GetDIBits
用来将位图数据从屏幕兼容的设备上下文中获取到某种格式的 DIB 中。我的印象是,当源位图为每像素 8 位或更少时,DC 仅用于合成颜色表。由于我的源位图是一个完整的 32 位彩色图像,而且这是一个一次性程序,而且我没有方便的屏幕 DC,我将 HDC 参数设置为 NULL。这没有用。一旦我抓住屏幕 DC 并将其传递进去,它就开始工作了。
这让我想知道为什么GetDIBits
需要设备上下文。它是干什么用的?
bitmap - 使用 BITMAP::bmBits 与 GetDIBits 有什么区别?
我刚刚意识到BITMAP
GDI 中存在,然后您GetObject(hBmp, sizeof(BITMAP), &bmp);
几乎在所有GetDIBits
示例中都这样做。但是这里新填充的 bmp 有一个字段:bmBits
如果我这里已经有位图的位,我为什么还要GetDIBits
再打电话?
谢谢,阿里维利
winapi - 需要与设备无关的位图位
我正在用 C++ 构建一个要导入 VB 项目的 dll。dll 公开了一个函数,该函数将通过 Win Shell 提取指定文档的预览图像,然后将其写入缓冲区以供 VB 应用程序使用。
到目前为止,我能够毫无问题地获得 HBITMAP 句柄。我还能够使用 GetBitmapBits 函数提取位图数据。但是,这不起作用,因为需要位数据的对象需要它是与设备无关的格式。
我读过 GetDiBits 是用于此目的的函数,但我很难弄清楚如何成功调用该函数。
我应该使用什么设备上下文?另外,如何确保它以独立于设备的格式写出数据?
提前致谢。
winapi - 使用 Windows GetDIBits 函数获取位图像素值
我正在尝试使用 GetDIBits 函数获取位图的像素。由于我没有研究过 Windows GDI/API,我对第一个论点 HDC 非常不确定。我在 SO 和网络上搜索了无数帖子,但无法找到有关如何在这种特定情况下初始化 HDC 的信息或示例。这是我读取像素值的程度:
解决方案:
在网上搜索了一些之后,我已经能够拼凑出以下内容:
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,我会遇到访问冲突。这是正常的还是有一些适当的方法可以释放它?
c++ - 使用 GetDIBits 访问图像的像素颜色
我可以使用 GetDIBits 加载当前窗口的颜色内容,但我不知道如何从某个位置加载图像的颜色。有人可以告诉我该怎么做吗?
我以这种方式将颜色加载到数组中
我是 Windows 编程新手,只想知道如何将图像加载到 hdc 上。
正如雷蒙德建议的那样,我将第二个参数传递为
我仍然只捕获活动窗口的颜色而不是图像的颜色。我如何更改设备句柄以反映这一点。