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

c - 使用 BitBlt 捕获桌面像素颜色

现在我正在使用 GetPixel() 从桌面检索大约 64 个像素以获得它们的颜色。我读到 GetPixel() 很慢,但认为这对几个像素无关紧要,但每次运行例程都需要 1.5 秒。在做了一些研究之后,我得出的结论是 bitblt 似乎是我正在寻找的东西。我想要做的是抓取桌面的定义区域(包括所有窗口),然后在给定的偏移量处抓取像素颜色。这就是我现在正在做的事情:

}

我找到了大量的教程和文档,但是对于 Windows API 来说太新了,它们对我来说并没有做太多。谢谢!

0 投票
1 回答
1973 浏览

gdi+ - 是否可以直接在 GDI+ 位图上进行 BitBlt?

我正在尝试将 BitBlt 从 HBITMAP 转换为 GDI+ 位图。我试过这个,但没有任何反应:

编辑:显然,如果我获得了 hDC,然后再将它与 BitBlt 一起使用,它就无法工作。我需要确保 hDC 仍然有效。这是解决方案:

有谁知道为什么这个改变是必要的?为什么使用第一个示例中较早获得的 hDC 可能不起作用?

0 投票
1 回答
5549 浏览

winapi - 是否可以直接从 GDI+ 位图 BitBlt?

是否可以使用 BitBlt 直接从 GDI+ 位图中复制而不使用 GetHBitmap?

GetHBitmap 很慢,因为它制作了整个图像的新副本,除了 BitBlt 副本之外并且比 BitBlt 副本慢,并且必须释放给定的 HBITMAP。图像很大。

有没有办法让 BitBlt 使用原始 GDI+ 图像的像素数据?

编辑: 我可以获得指向 GDI+ 位图像素数据在内存中的位置的指针。我可以创建一个指向 GDI+ 位图像素数据的 HBITMAP 以避免额外的副本,以及由此产生的 BitBlt 吗?

0 投票
0 回答
516 浏览

c# - 如何让 bitblt 复制子控件而不将子控件绘制到屏幕上?

这是我的问题的简短之处:在自定义控件中,有没有办法将其子控件的父绘制/bitblt 获取到背景图像,但不让子控件实际绘制在控件上?

详细信息: 我正在尝试推出自己的双缓冲(在紧凑框架上)并且遇到了很多问题。我有一个相当复杂的用户控件。它有一个Panel带有滚动Panel(可变大小)的视图(固定大小)。卷轴Panel上有几张卡片Panels。卡片面板垂直堆叠包含两个DataGrids和两个Labels

这是我的控件的视觉轮廓

好的,那么现在解决问题。我覆盖滚动面板的 on paint 并执行 bitblt 以获取图像以显示为“自定义绘画”。我通过保存它来测试图像,这正是我想要的。

问题是数据网格和标签仍然可以正常绘制。因此,当我滚动时,会留下文物。所以,我重写了 OnPaint 对网格和标签什么都不做。但是当我这样做时,bitblt 不再拾取网格(但奇怪的是它仍然拾取标签)。

那么,在自定义控件中,有没有办法让父控件将其子控件绘制/bitblt 到背景图像,但不让子控件实际绘制在控件上?

注意:如果您有兴趣查看我的完整代码,可以在此处查看

0 投票
0 回答
603 浏览

c# - BitBtl 和 DWM 的问题 (Windows Aero)

我正在开发一个必须截取全屏游戏截图的应用程序。问题是我尝试了很多方法,但是当游戏处于全屏模式时,它们中的任何一个都能够截取屏幕截图,它只会截取游戏下方的内容和左上角的黑色矩形。

有没有其他不涉及挂钩的方法来实现这个目标?因为我正在使用 C#,这是一种糟糕的语言来制作这种东西。

这是我现在的代码:

这在 XP 上可以正常工作,但是在 Vista / 7 上,我需要禁用 Aero 才能使此代码正常工作,或者它只会截取我之前所说的游戏内容的屏幕截图。

0 投票
2 回答
1053 浏览

c - 为什么没有使用 SelectObject 和 BitBlt 函数将屏幕截图绘制到我的窗口上?

我正在尝试从屏幕的 0x0(左上角)位置获取 500x500 的屏幕截图并将其放在窗口中。

这是我的代码(hwnd是我的窗口句柄):

我在这里想念什么?我在窗口内变黑而不是屏幕截图。

编辑

在我更改memoryDcdc 之前它之后它可以工作BitBlt(appDc, 0, 0, 500, 500, memoryDc, 0, 0, SRCCOPY); 但现在问题是 SelectObject 不起作用。我的意思是它没有将图像放在 HBITMAP 中。但是 BitBlt 正在从复制dcappDc

0 投票
1 回答
1862 浏览

windows - 为什么 Bitblt 不能工作

为什么文本不能在窗口显示?

0 投票
3 回答
8071 浏览

c# - 将图形内容复制到位图

我尝试将图形对象的内容复制到位图。我正在使用此代码

如果我使用这样的方法

位图包含内容。但是,如果我在调用方法之前绘制图形对象,则位图是空白的:

为什么它在第一种情况下有效,而在后一种情况下无效?

0 投票
2 回答
1459 浏览

c++ - 控件在窗口中绘制 gdi

我过去(很久以前)使用过 Visual Basic 6,它有一个名为 PictureBox 的控件,您可以在其中绘制东西,如果需要,可以获取设备上下文等。我现在正试图找出如何拥有纯 GDI/WinApi(无 MFC、.net、atl、gdi+ 等)中的类似“控件”。我使用的是所有者绘制的按钮控件,但是当它被点击时你不能(容易地)获得鼠标坐标,所以我想我需要一些其他的控件。我尝试了一个静态控件,但那个控件没有所有者绘制支持。我尝试处理 WM_PAINT,但据我所知(在谷歌搜索数小时后),无法使用它来更新客户端的一个区域或单个 HWND。

所以,我要问的是,人们如何使用纯 GDI 和 Windows API 对窗口的选定区域(无论是控件还是其他)进行动画处理或 blit?我知道 MFC 有一种称为子类化的东西,但由于 MFC 只是 Windows API 的包装器,因此必须有一种方法可以在没有它的情况下做到这一点(正如我之前所说,MFC 不是一个选项)。

0 投票
1 回答
4382 浏览

visual-c++ - 如何加快 BitBlt 以使用 aero 捕获屏幕?

我使用以下代码通过 GDI 函数捕获屏幕:

问题是:当 Aero 打开时, BitBlt功能非常慢 - 它需要将近 50 毫秒(这对我来说是不可接受的,因为我需要在一秒钟内捕获多次)。

BitBlt 直接从视频硬件获取像素数据。但是显卡在我的测试机器(即 Radeon 5470 和 Radeon 4850)中相当不错,所以我不明白哪里出了问题。我知道这些卡片(任何现代卡片)在 2D 中不如在 3D 中那么好,但我认为简单的 blit 操作不应该花费 50 毫秒。

所以,你能建议怎么做吗?在我的情况下,任何类型的“hackish”解决方案(只要它可以稳定工作)都可以。

目标系统是 Win7 x64,32 位代码。

提前致谢!