问题标签 [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 回答
191 浏览

c++ - 关于 GetDIBits 和设备上下文的奇怪错误

今天遇到一个很奇怪的问题。在带有MFC项目的VC6上运行以下代码,它是黑屏,如果我拿出评论,它可以完美运行并显示桌面图片。但是这些代码是在无限循环中执行的,所以我尝试减少内存复制和内存消耗等BitBltCreateCompatibleBitmap我不明白我的程序与这些注释代码有什么关系。任何人都知道导致问题的原因和原因?

0 投票
1 回答
568 浏览

winapi - 了解 GetDiBits。C++

MSDN说GetDiBits在调用这个函数之前,不应该将使用的位图选入DC。但是根据我的经验(with BitBlt),我知道除非选择位图,否则我无法绘制位图。

  1. 如何GetDiBits规避这一点?我可以只使用未选择的、新创建的位图作为该函数的参数吗?
  2. GetDiBits以及CreateDibSection返回一个数组。但 MSDN 谈到了第一个功能:

    “指定兼容位图的位”

    我认为 DI 代表 DeviceIndependent。为什么会有矛盾?这意味着,根据 MSDN,GetDiBits只能与CreateCompatibleBitmap(即 DD)一起使用?那我不能把这个数组发送到另一台机器上显示,对吧?

  3. 这两个功能都使用一个hDC。如果CreateDibSection真的是独立的,为什么它需要一个hDC?所有需要的信息都通过 bitmapinfoheader 提供...
0 投票
2 回答
227 浏览

c++ - GetDiBits:BITMAPINFOHEADER 中传递的不同维度

根据我使用此功能的经验,我对 GetDiBits 有一些疑问。我错误地创建了一个两倍于我需要大小的位图:

我没有注意到,因为代码的下一部分有效。我在此位图的一半上 BitBlt 屏幕的一部分:

然后我得到对应的数组:

当我将所有这些数据发送到另一台计算机时,图像完全正确(没有黑色边缘,因为它会在发送过大位图的情况下出现)。这意味着 GetDiBits 会忽略位图的正确大小并使用 BITMAPINFOHEADER 中提供的大小,而不会崩溃。(我用的是Win10。)

这是正常的吗?因为我不想通过网络发送不需要的字节,所以我不得不问:GetDiBits 是否输出正确尺寸大小的数组: (4*radius^2)*3 或者它是否关注结构中的值:半径^2 *3 -忽略填充-?

0 投票
1 回答
230 浏览

c# - DrawIconEx 和 GetDIBits 的奇怪行为,alpha 为零

我正在使用此代码来捕获屏幕+光标:

由于某种原因,当光标是工字梁(文本光标)时,它应该位于的图像区域全是透明的。RGB 信息在那里,但 alpha 位是0. (右图是手动将所有像素 alpha 位设置为 255 后帧的样子)。错误的 正确的

如果光标是箭头,则正常工作。

但是,如果我Bitmap从句柄中获取然后保存到磁盘,则图像没有透明孔,正如预期的那样。

这是怎么回事?是 withDrawIconEx还是 with FromHbitmap

也许FromHbitmap总是将所有像素的 alpha 设置为 255?也许GetDiBits以不同的方式合并两个图像(屏幕截图+光标)?

编辑

作为快速修复,我知道我可以检测光标是否为 I-Beam(蒙版单色类型)并在保存像素阵列时手动修复它。

和:

0 投票
1 回答
150 浏览

c++ - GetDIBits 在屏幕捕获函数中多次迭代后返回零

我正在使用此代码来捕获屏幕和光标。

屏幕截图完美运行,但在屏幕截图超过 8 分 30 秒后总是失败。8 分 30 秒后 GetDIBits 开始返回 0 。我在装有 Windows 10 专业版的 64 位机器上运行它。如果我删除光标捕获代码,此问题似乎不会出现。

0 投票
1 回答
77 浏览

c++ - GetDIBits 返回所有值为 0 的数组

我需要在屏幕上找到一些图像。我决定做一个简单的比较循环。

我发现这个答案似乎很有帮助并编写了下一个代码:

两个问题:

  1. 我的屏幕分辨率是 1280x800=1 024 000 px,MyBMInfo.bmiHeader.biSizeImage等于 4 096 000。是 rgb a还是什么?
  2. 主要问题:虽然没有错误,而且我在上一个问题中提到的值不是零,但是在代码底部的循环中,所有的值lpPixels都是零,我没有得到任何输出。为什么?