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

winapi - Win32 窗口捕获,BitBlt 不显示边框

我已经编写了一些 c++ 代码来将窗口捕获到 .bmp 文件。

它可以在 XP 下找到,但在 Vista 下,窗口的边框是透明的。

使用 PrintWindow 可以解决问题,但出于性能原因是不可接受的。

是否有性能代码更改,或者可以更改设置以使边框不透明?

0 投票
1 回答
1356 浏览

c# - 使用透明混合将小位图复制到大位图:什么比 graphics.DrawImage(smallBitmap, x , y) 更快?

我已将此调用确定为高压功能中的瓶颈。

有没有更快的方法将小的半透明位图混合成更大的半透明位图?

示例用法:

DrawImage 调用采用一个小的 32bppPArgb 位图并将它们复制到一个较大的位图中,这些位图的位置不同,并且小位图可能仅部分重叠较大的位图可见区域。两个图像都有半透明的内容,这些内容由 DrawImage 以对输出很重要的方式混合。我已经使用 BitBlt 进行了一些测试,但没有看到显着的速度改进,并且 alpha 混合在我的测试中并没有出现相同的结果。我对任何方法都持开放态度,包括更好地调用 bitblt 或不安全的 c# 代码。

0 投票
2 回答
1344 浏览

c# - 直接画到屏幕后如何自己清理

我正在使用BitBltand直接在屏幕上绘图GetDC(IntPtr.Zero)。完成后是否有某种方法可以在整个屏幕上调用 Refresh 或 Invalidate,这样我就不会在各处留下大块油漆(从数字上讲)?

更新: 当您像我正在做的那样直接在屏幕上绘制时,无论您绘制什么都保留在那里,直到它下面的窗口重新绘制自身(并且这样做,重新绘制它所覆盖的屏幕部分)。

问题是 Windows 桌面的某些部分不会长时间重新绘制自己。例如,如果我在任务栏顶部绘制,实际任务会很快重新绘制自己(以及“开始”按钮等),但任务栏本身会保留我所绘制的内容长达几分钟。

如果我的应用程序有一个覆盖整个屏幕的窗口,我只会调用Invalidate()该表单,这会导致它重新绘制自身并因此重新绘制整个屏幕。我需要的是某种调用方式InvalidateRefresh整个屏幕本身。

0 投票
1 回答
4080 浏览

c# - 如何提高 GDI 的 DrawImage(未缩放)的性能?

在我的用户控件的绘制处理程序中,我迭代了一组预定义的 Bitmap 对象并将它们绘制到客户区:

C#版本:

VB.NET 版本:

代码运行良好,但在将十几个对象添加到集合时开始陷入困境。我的问题是:有没有办法加快速度?是否可以使用 Win32 bitblt 函数来替换 DrawImageUnscaled?如果是这样怎么办?

谢谢!

注意:到目前为止,谷歌搜索 BitBlt 的使用只产生了我的屏幕截图样本......

0 投票
1 回答
1531 浏览

bitblt - SRCCOPY 从 BITBLITTED IMAGE 中删除透明度

我知道前两个 bitblts 使透明度,但第三个删除它!我在这里做错了什么?

0 投票
1 回答
624 浏览

winapi - WinAPI/GDI:为什么大窗口的快照包括任务栏?

我正在使用 GDI+ 拍摄窗口快照,代码是:

其中 hDC 之前设置为:

这非常适合小窗户,但是一旦我尝试比屏幕大的窗户。

即任务栏也得到保存。是什么赋予了?

0 投票
1 回答
2223 浏览

c++ - 16 位桌面颜色深度中的 BitBlt + UpdateLayeredWindow 和 CreateDIBSection

我在客户区有一个透明背景的应用程序,因为窗口没有分层,所以它被绘制为黑色。在它的每一条 WM_PAINT 消息中,我都在对内存 DC 执行 BitBlt,之后我使用带有 UpdateLayeredWindow 的内存 DC 到分层画布窗口。

内存-DC的设置:

在 WM_PAINT 中,我使用 BitBlt 函数将应用程序客户区 DC 信息复制到内存 DC。之后,我将使用内存 DC 执行 UpdateLayeredWindow 到分层画布窗口 DC(它的 CWnd)。所以它是实时的,结果是:我有一个正常的应用程序窗口和一个分层的窗口,除了不规则的形状和每像素的透明度。

在 32 位桌面颜色深度下一切正常!如果我切换到 16 位,分层画布窗口就会变得混乱。绘图看起来很糟糕,整个窗口虽然可以点击。

它认为这是因为缺少 alpha 通道信息。

所以我在谷歌上搜索了很多解决方案。我发现在这种情况下,我必须使用

而不是 CreateCompatibleDC(NULL)。因为兼容的 DC 会给我一个 16 位的 DC。

使用 CreateDC 绘图效果更好。但是整个窗口仍然是可点击的,并且在分层窗口中透明度被绘制为黑色。

所以我认为问题出在 BitBlt 或 CreateDIBSection 的 BitmapInfoHeader 上。

  1. 我不知道是使用 BitmapInfoHeader.biBitCount = 32 还是 BitmapInfoHeader.biBitCount = 16 位。认为它是 32。那么 biCompression -> BI_RGB 或 BI_BITFIELDS 呢?

  2. 如何在 BitBlt(..., SRCCOPY) 16 位 DC 到 memory-DC 之后将 alpha 通道信息添加到 memory-DC,以便它与 UpdateLayeredWindow 一起使用?(也许:将 rgb 通道与 alpha 通道预乘?)不知道该怎么做。


我稍微接近了 16 位桌面颜色深度问题。

以上似乎工作。但是我的 UpdateLayeredWindow 函数产生的结果看起来很乱。

所以,这是因为缺少黑色!每个全黑的像素都变得透明。您可以查看并单击。所有其他像素都失去了黑色部分,只能点击通过。

我做了一个测试:我打开了Windows Paint.exe,制作了一个窗口宽度和高度以及黑色作为填充颜色的表面。

然后我把它放在我的分层窗口下(缺少黑色),再次将分层窗口作为前景窗口,然后ta-da,我的分层窗口与通过Paint.exe黑色像素的闪耀相结合看起来很正常。

所以我用 BitBlt 过期了,它又是光栅操作参数。但没有运气。

在使用 UpdateLayeredWindow 绘图之前,如何将黑色与 BitBlt 混合到我的 DC 中?

0 投票
2 回答
3595 浏览

qt - BitBlt in Qt4?

What is the recommended method of copying one QImage into another at a particular position in Qt4?

QImage::bitblt was removed in Qt4.

Does the QImage now need to be converted to a PixMap and back?

0 投票
3 回答
4721 浏览

c++ - 裁剪函数 BitBlt(...)

我想在现有引擎中创建裁剪功能。这是我已经拥有的:

我希望它只是将整个图像复制到一个新的 HBITMAP 并用它替换旧的。所以我知道它有效。之后,它只是使用 BitBlt 参数。

m_Handle 是 Bitmap 类的 HBITMAP。

此代码的结果只是黑屏。

0 投票
1 回答
1180 浏览

vb.net - 在 .NET 2.0 VB 应用程序中为 x86 编译时,BitBlt 函数会生成空位图

我的 VB 项目中有一个 BitBlt 包装函数。当编译为任何 CPU 时它工作得很好,但是当我将它瞄准 x86 时它会创建一个空位图。我必须使用 x86,因为应用程序的其他部分需要它。有什么想法可能是错的吗?这是代码:

谢谢,布赖恩