问题标签 [bitblt]

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

c++ - Directx 11 Bitblt 替代品

我尝试将以下功能集成到我的 directx 11 应用程序中。当我使用directx9 时,一切正常,但是当转换为directx 11 时,我在Bitblt 行出现蓝屏死机错误(我一定是HDC 有问题?)。我想知道将此代码转换为 Directx 11 兼容表面而不是 HDC 的最佳方法是什么。

这是功能:

我传递给此函数的 HDC 是按以下方式创建的:

关于我做错了什么的任何想法?我似乎无法弄清楚发生了什么以及为什么当我使用 Directx 9 对象时会导致蓝屏,但它不会。有一个更好的方法吗?

(我也试过更新我的驱动程序,它们都是最新的)。

感谢您的帮助。

0 投票
1 回答
3690 浏览

vb.net - VB.NET BitBlt 将位图复制到屏幕

编辑:固定,我为图形对象创建了一个 compatibleDC,为位图创建了一个句柄(使用 b.gethbitmap),然后使用 GDI 中的 SelectObject 函数来选择这两个,并在 BitBlt 函数中使用 compatibleDC 而不是 hDc

我一直在尝试在屏幕上绘制位图(设备 0),但是在使用 BitBlt 复制图形时遇到了问题。

最初,我使用 SetPixel (gdi32) 直接绘制到桌面,但速度很慢,所以现在我设置位图对象的像素,然后从该对象创建图形,并将图形的 hdc 复制到屏幕。

我的猜测是我正在将图形对象的 HDC 添加到 intptr,这实际上给了我图形对象容器的 HDC,这不是我需要的。但即便如此,除了使用 BitBlt 之外,我还没有找到任何关于如何将位图复制到设备的信息。

这是我当前的代码(Windows 窗体应用程序、文本框、按钮) 文本框是要复制到的设备,按钮启动它。出于测试目的,将文本框文本设置为 0,然后按下按钮。您应该会在屏幕的左上角看到一个黑框 (50x50px)。如果工作正常,颜色应为蓝色:

它的工作方式是调用函数 setpx,给定循环内的位置和颜色,循环遍历框内的所有像素(在我的代码中为 50x50)。然后 setpx 函数将调用位图 b 上的 setpixel 函数。这部分工作正常。

接下来,它将从位图中定义一个图形对象 g,我使用 BitBlt 将 g 的 hdc (g.gethdc) 复制到屏幕上。这不能正常工作,这是正确的方法吗?

0 投票
2 回答
27617 浏览

c++ - 获取像素颜色最快的方法?

我正在尝试为 Windows 应用程序制作一个自动点击器。它运作良好,但速度非常慢!我目前正在使用“getPixel”方法,它每次调用时都会重新加载一个数组。

这是我当前的代码:

所以基本上,它只是扫描屏幕中的一个像素范围,如果它检测到一个红色按钮,它就会启动一个鼠标事件。

我知道还有其他方法可以获取像素颜色,例如 bitblt。但是我已经进行了一些研究,但我不明白我应该怎么做才能扫描颜色阵列。我需要一些可以非常快速地扫描屏幕的东西才能抓住按钮。

请你帮助我好吗?

谢谢。

0 投票
2 回答
2504 浏览

c++ - 使用 BitBlt 捕获程序窗口总是返回相同的图像

我编写了以下代码(C++ Win32)来捕获游戏窗口屏幕并从图像中获取像素颜色数组。函数 autoB() 完成了这项工作。

然后我将结果数组绘制到我的窗口中,以直观地检查我得到了什么。

问题是这个程序在我启动计算机后只运行一次,在它第一次“缓存”从游戏中截取的第一个屏幕截图之后,我总是得到相同的像素数组。即使我关闭并重新启动程序,我也会得到相同的屏幕截图。

游戏没有使用 DirectX 在屏幕上绘图,我总是可以使用 Alt+PrtSc 截取屏幕截图。

任何有助于理解为什么会以这种方式发生的帮助表示赞赏。

更改屏幕截图的唯一方法是重新启动游戏。然后,第一个屏幕截图被捕获,无论游戏窗口中发生什么,都会一遍又一遍地显示。

0 投票
1 回答
1140 浏览

c++ - Bitblt,createdibsection,图像损坏

嗨,我正在尝试捕获屏幕截图,但图像已损坏,任何人都可以看到代码有什么问题,基本上我正在尝试使用 createdibsection,因此我可以直接访问这些位。

这是生成的图片的样子 http://oi47.tinypic.com/33c4zko.jpg

这就是代码,然后我只是用它来捕获屏幕

0 投票
1 回答
649 浏览

c++ - BitBlt 在特定条件下仅复制部分数据

这是一个奇怪的问题,我已经阅读了 BitBlt 函数的文档,它在大多数情况下都可以正常工作,但是如果我尝试从偏移量很大的源矩形复制数据,它就会开始失败(只复制一部分甚至没有复制)比目的地大...奇怪??以下是几个示例:

这是我使用的代码,结果取决于我传递的参数。位图的宽度m_iTileAreaWidth + 2 * m_iTileAreaMargin和高度分别为m_iTileAreaHeight + 2 * m_iTileAreaMargin

如果m_iTileAreaMargin600并且都是200m_iTileAreaWidth复制 130px的源区域m_iTileAreaHeight

如果m_iTileAreaMargin500并且都是200m_iTileAreaWidth则复制完整的源m_iTileAreaHeight

如果m_iTileAreaMargin800并且都是200则不复制m_iTileAreaWidth任何源区域m_iTileAreaHeight

好吧,我确定整个区域都已生成 - 当我使用此代码时:

然后我看到整个区域生成

有谁知道为什么我对这么简单的功能有这样的问题?

0 投票
0 回答
409 浏览

c++ - 为什么 BitBlt 会挂起?

我正在编写 C++ 代码来自动截取我最喜欢的游戏的屏幕截图。我的部分代码如下所示:

我之前已经初始化了相关变量,如下所示:

没有明显的原因,代码在 BitBlt 函数处挂起,直到某些(但我不知道是什么)更新。我在游戏中单击一个按钮或单击游戏外的一个窗口的毫秒数,BitBlt 完成,其余代码完美执行。神秘的是,我最近才遇到这个问题;它以前从未发生过。更神秘的是,它只发生在我的笔记本电脑上,而不是我朋友的笔记本电脑上。会发生什么?

0 投票
0 回答
155 浏览

winapi - 为什么 BitBlt 在不同的地方有不同的结果

我为 BitBlt 编写了一个测试样本,在 WinProc 中,WM_PAINT 执行此操作:它将重复从窗口 (0,0) 绘制小块到客户区。

但是如果我写一个函数做同样的事情并标记上面的代码,结果就是一张大图,谁能告诉我为什么?

这个示例来自编程 windows CH14 BitBlt 项目,我修改了一些。项目目标是使用window(0,0,cxSource, cySource)中的小图案来填充客户区,但是如果我在另一个函数中写这个,结果是,只有一张大图。提前致谢。

0 投票
1 回答
388 浏览

python - Python/GTK 中的块像素移位

我想使用 Python 2.6 和 gtk+(根据 Centos 6.3)制作一个横向滚动的文本框(“自动收报机”显示)。

我制作了一个计时器驱动的例程,它接受一个文本字符串并重复打印它,同时增加打印窗口中的偏移量。这行得通,但似乎比我想要的处理器密集程度略高。

而不是以递增的偏移量完全重复地打印字符串 - 有没有办法以某种方式使用块移动加速并从大多数 GPU 上使用“blitting”硬件中受益?我想知道字符串是否可以打印到某种类型的像素缓冲区,然后相关部分可以“blitted”到屏幕内存?任何意见或经验将不胜感激。

我的目标硬件是基于 Intel 945GME 的。

0 投票
1 回答
606 浏览

linux - 如何在Linux中捕获桌面屏幕并在窗口上绘制

我是 linux 新手,我需要将我的 windows 程序移植到 linux 并需要以下帮助。

  1. 我需要捕获屏幕。
  2. 我需要创建一个覆盖整个屏幕的没有边框和标题的窗口。
  3. 我需要在该窗口上绘制捕获屏幕。
  4. 我需要以 XX% 的不透明度在窗口上混合黑色图片。

所有这些都可以通过 Windows 上的 GetDC(NULL)、BitBlt() 和 AlphaBlend() 轻松完成。

Linux 看起来很难做这些简单的程序。