精易论坛

标题: DXGI高效率抓屏源码 [打印本页]

作者: 啪啪啪么么哒    时间: 2018-7-16 13:35
标题: DXGI高效率抓屏源码
本帖最后由 啪啪啪么么哒 于 2018-7-16 14:01 编辑

win8以上微软推出了新的抓屏方式,dxgi抓屏。
只有win8以上能用,比传统的gdi抓屏方式效率高了非常多
gdi方式抓取1帧大概50毫秒左右, DXGI方式10毫秒都不到。
下面是以25帧下的CPU占用率



code.rar (50.55 KB, 下载次数: 626)






补充内容 (2020-4-13 12:54):
代码在某些分辨率下会有问题,等有时间了会重新整理一份

补充内容 (2021-1-10 21:46):
最新代码见61楼

补充内容 (2021-12-20 15:48):
有网友反馈有内存泄露问题,已经更新,见75楼
作者: longsui48    时间: 2018-7-16 13:53
那我们win7 怎么办
作者: 啪啪啪么么哒    时间: 2018-7-16 14:02
longsui48 发表于 2018-7-16 13:53
那我们win7 怎么办

MirrorDriver技术,不过比较复杂
作者: longsui48    时间: 2018-7-16 14:07
啪啪啪么么哒 发表于 2018-7-16 14:02
MirrorDriver技术,不过比较复杂

再见 自己写截屏都比这个简单啊
作者: sampo    时间: 2018-7-16 14:18
感谢楼主分享
作者: mingyun123    时间: 2018-7-16 14:51
支持楼主谢谢分享
作者: dulang    时间: 2018-7-17 10:29
这个要顶一下
作者: 写不完的圈圈    时间: 2018-7-17 15:42
感觉很厉害的样子
作者: 1771509907    时间: 2018-7-17 15:54
感觉很厉害的样子
作者: 练祖岚    时间: 2018-7-19 09:38
还是那句话,我是来拿精币的
作者: hzla63997530    时间: 2018-7-19 18:26
再见 自己写截屏都比这个简单啊
作者: cxyhsy    时间: 2018-7-19 23:07
顶一下。。。。
作者: a2603025038    时间: 2018-9-26 19:42
唯一的教程,必须顶一下
作者: a2603025038    时间: 2018-9-26 23:38
指定数据类型名称不存在咋办
作者: 啪啪啪么么哒    时间: 2018-9-27 13:47
a2603025038 发表于 2018-9-26 23:38
指定数据类型名称不存在咋办

截图看错误在哪
作者: 小花匠    时间: 2018-9-29 12:48
谢谢楼主分享



作者: a2603025038    时间: 2018-9-30 03:17
今天运行又正常运行了,就是截图有点花花的感觉


作者: 啪啪啪么么哒    时间: 2018-9-30 11:09
a2603025038 发表于 2018-9-30 03:17
今天运行又正常运行了,就是截图有点花花的感觉

是不是笔记本双显卡,禁用集显试试,或者改变一下分辨率
作者: 风里刀    时间: 2018-9-30 11:15
这个刚好需要
作者: a2603025038    时间: 2018-9-30 20:27
我将分辨率调到1280*768之后就能正常运行了,很多个窗口,就是截图里面没有鼠标,不过还是谢谢提供源码参考。
作者: xieshao2018    时间: 2018-10-5 21:57
看看再说吧
作者: xiaoyaotianshen    时间: 2018-12-16 20:19
好东西看看能不能用
作者: zpftc    时间: 2018-12-23 13:30
xxyx,louzhu
作者: hedgehog    时间: 2019-6-17 02:02
真是个好东东,正在寻找
作者: sdaq1000    时间: 2019-7-2 12:53
感谢感谢
作者: shuogege    时间: 2019-7-30 22:50
必须顶一下!技术贴。
作者: 沧海生烟    时间: 2019-8-2 02:37
这个正需要
作者: 大白梨    时间: 2019-8-5 19:09
花屏啊,求完善...
作者: 17839710626    时间: 2019-8-11 20:11
这个正需要
作者: sony09090    时间: 2019-10-22 17:44
必须顶一下!技术贴。
作者: 一粒红尘    时间: 2019-11-4 11:54
用易你搞这么多 英文, 是在难为谁呢,
作者: 17839710626    时间: 2019-11-11 19:25
必须顶一下!技术贴。
作者: glxmfyx    时间: 2019-11-15 23:59
不错,多谢分享
作者: 勾栏听曲    时间: 2019-11-17 23:40
这个能窗口截图吗
作者: xiehanyu    时间: 2019-11-18 14:41
必须看看!这么科技!好东西
作者: HappyPig    时间: 2020-1-16 14:05
感谢分享,但是怎么启动录制和保存呢?
作者: GaoCuVar雨点    时间: 2020-3-18 23:59
本帖最后由 GaoCuVar雨点 于 2020-3-19 20:59 编辑


作者: GaoCuVar雨点    时间: 2020-3-19 19:00
本帖最后由 GaoCuVar雨点 于 2020-3-19 20:59 编辑


作者: GaoCuVar雨点    时间: 2020-3-19 19:01
本帖最后由 GaoCuVar雨点 于 2020-3-19 20:58 编辑

效果速度都很好
作者: GaoCuVar雨点    时间: 2020-3-19 19:21
本帖最后由 GaoCuVar雨点 于 2020-3-19 20:58 编辑

效果不错

作者: GaoCuVar雨点    时间: 2020-3-19 19:26
本帖最后由 GaoCuVar雨点 于 2020-3-19 20:58 编辑


作者: 17839710626    时间: 2020-4-10 16:16
c代码不能编译啊 少东西了
作者: 啪啪啪么么哒    时间: 2020-4-13 12:55
17839710626 发表于 2020-4-10 16:16
c代码不能编译啊 少东西了

请贴出报的错误
作者: caskywz    时间: 2020-4-19 19:37
截图后直接用H254加密一次就好了
作者: caskywz    时间: 2020-5-1 14:22
我调用案例之后 发现cpu直接跑到30%左右。
感觉不因该啊。我用OBS 截图(30帧) 截图加H264编码才5%(硬编)
理论上DXGI截图 CPU占用应该很低的
作者: xinrannb    时间: 2020-5-7 10:32
在,win10鬼畜qwq
作者: 小Ye夜    时间: 2020-5-10 09:25
感谢开源。这个很不错
作者: 啪啪啪么么哒    时间: 2020-5-10 18:28
xinrannb 发表于 2020-5-7 10:32
在,win10鬼畜qwq

有空改一下,上传一个较为完美的版本
作者: 啪啪啪么么哒    时间: 2020-5-10 18:28
caskywz 发表于 2020-5-1 14:22
我调用案例之后 发现cpu直接跑到30%左右。
感觉不因该啊。我用OBS 截图(30帧) 截图加H264编码才5%(硬编 ...

dll内部有几次copy,可以改一下
作者: caskywz    时间: 2020-5-15 20:47
啪啪啪么么哒 发表于 2020-5-10 18:28
dll内部有几次copy,可以改一下

尝试了 .C++看不懂....有空你重新整理可以尝试把dll的内部copy改一下.

最重要是.输出字节集的类型
与易语言的位图方式不一样..这个就很难调试了.

' 子类化
' m_pWndProc = GetWindowLongA (取窗口句柄 (), #GWL_WNDPROC)
' SetWindowLongA (取窗口句柄 (), #GWL_WNDPROC, 到数值 (&_WindowProc))
这二段完全看不懂,

作者: caskywz    时间: 2020-5-19 19:44
啪啪啪么么哒 发表于 2020-5-10 18:28
dll内部有几次copy,可以改一下

CPU占用过高的问题解决.现在截图25帧稳定在5%.我把截图的数据添加JMP文件头之后.打开是花瓶的..我在尝试把BGRA的转移成BGR的试试.也就是BMP的标准格式.
作者: caskywz    时间: 2020-5-19 19:47
啪啪啪么么哒 发表于 2020-5-10 18:28
dll内部有几次copy,可以改一下

bmp................
作者: 啪啪啪么么哒    时间: 2020-5-20 21:19
caskywz 发表于 2020-5-19 19:44
CPU占用过高的问题解决.现在截图25帧稳定在5%.我把截图的数据添加JMP文件头之后.打开是花瓶的..我在尝试 ...

花屏的问题是因为目前代码有些问题,暂时没时间处理
作者: caskywz    时间: 2020-5-21 20:09
啪啪啪么么哒 发表于 2020-5-20 21:19
花屏的问题是因为目前代码有些问题,暂时没时间处理

你说的花瓶 应该是指特殊分辨率下的花瓶吧?..正常分辨率 下 直接绘图是不花的..但是比较奇怪的是.添加BMP文件头会花
作者: 17839710626    时间: 2020-5-25 21:06
h264这块的 代码能 提供吗
作者: xiehanyu    时间: 2020-5-26 18:37
这个东西应该比较好!先看看
作者: yangyi2020    时间: 2020-7-17 01:30
新版本代码出了吗
作者: genghanqiang    时间: 2020-8-31 18:41
支持楼主,找了很长时间了
作者: z582601898    时间: 2020-12-9 13:32
感谢分享
作者: 木小果    时间: 2021-1-2 22:45


楼主啥时候更新呀......屏幕缩放下就是这样了

作者: szxiao    时间: 2021-1-7 09:35
支持一下。看怎么实现的。
作者: 啪啪啪么么哒    时间: 2021-1-10 21:45
本帖最后由 啪啪啪么么哒 于 2021-1-10 21:56 编辑

许久不上论坛了,才看到。匆忙修改了花屏的bug,有没有其他问题暂时不清楚

code210110.zip

371.11 KB, 下载次数: 198, 下载积分: 精币 -2 枚


作者: 一只小锅铲    时间: 2021-1-23 18:27
支持一下
作者: 一只小锅铲    时间: 2021-1-23 18:31
这个不错
作者: 一只小锅铲    时间: 2021-1-23 18:32
应该可以做远程桌面
作者: zhouzheng398    时间: 2021-1-25 14:29
总算更新了
作者: z13228604287    时间: 2021-1-26 21:50
会出现内存部  不住
作者: 15123845806    时间: 2021-1-27 22:57
#在这里快速回复#DXGI高效率抓屏源码
作者: 孤城已故    时间: 2021-4-28 04:44
路过围观一下,顺便帮顶
作者: jhzljy    时间: 2021-6-8 23:42

作者: jhzljy    时间: 2021-6-8 23:45

作者: chenboss    时间: 2021-7-11 22:22
啪啪啪么么哒 发表于 2021-1-10 21:45
许久不上论坛了,才看到。匆忙修改了花屏的bug,有没有其他问题暂时不清楚
...

贴主你好,向你反馈一个bug,帧率调高60,有内存泄漏。。运行几分钟内存就吃光了,在任务管理器看到进程占用的内存正常,但剩余可用内存会一直减少。还有一个请求,能否在模块里面增加一个函数,抓图格式转成bmp格式字节集返回,我在易语言上面写了个BGRA转bmp的字节集操作,发现效率极低。。
作者: 浩知宇    时间: 2021-9-26 00:06
学习一下
作者: 1591169538    时间: 2021-11-23 16:01
学习一下
作者: wyd168    时间: 2021-12-17 15:29
这个能录DHF的VEP的吗
作者: 啪啪啪么么哒    时间: 2021-12-20 15:47
本帖最后由 啪啪啪么么哒 于 2021-12-20 15:50 编辑

修复了可能的内存泄露问题,增加抓屏超时参数,如还有相关问题请回帖反馈

code211220.zip

55.78 KB, 下载次数: 394, 下载积分: 精币 -2 枚


作者: jsxy    时间: 2022-1-5 06:00
啪啪啪么么哒 发表于 2021-12-20 15:47
修复了可能的内存泄露问题,增加抓屏超时参数,如还有相关问题请回帖反馈
...

楼主 代码文件没上传呀 谢谢
作者: Scanf1    时间: 2022-1-19 11:02
楼主大佬你好,最近在研究yolov5方面,然后需要能快速截屏,于是搜到了你这个帖子,但是从python调用这个dll,遇到了一些问题,转化出来的图是黑屏,不知道问题出在哪里了
[Python] 纯文本查看 复制代码
import time
from ctypes import *

pDll = cdll.LoadLibrary("MirrorScreen.dll")
gdi32 = windll.LoadLibrary('gdi32.dll')
pDll.dxgi_create.restype = c_void_p

m_dxgi = pDll.dxgi_create()
print(m_dxgi)
if m_dxgi != 0:

    m_bin_size = pDll.dxgi_get_size(m_dxgi)
    m_nHeight = pDll.dxgi_get_width(m_dxgi)
    m_nWidth = pDll.dxgi_get_width(m_dxgi)
    print(m_bin_size)
    m_bin = create_string_buffer(m_bin_size)
    print(m_bin, type(m_bin))
    ret = pDll.dxgi_get_frame(m_dxgi, m_bin, 0)

    if ret == 0:
        ret1 = gdi32.CreateBitmap(m_nWidth, m_nHeight, 1, 32, m_bin)
        print(ret1)
        # 写到这里不知道怎么去写了
    pDll.dxgi_destroy(m_dxgi)



作者: Xiaochuzhang    时间: 2022-1-30 19:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: LSugar    时间: 2022-2-13 11:28
指定数据类型名称未找到。

作者: LSugar    时间: 2022-2-13 11:56
创建失败,为什么啊。
作者: LSugar    时间: 2022-2-13 12:21
win11创建失败
作者: LSugar    时间: 2022-2-26 09:29
看不懂,不会取位图字节集数据。
作者: hjdnwx    时间: 2022-3-17 09:57
66666666666666666666666666
作者: hjdnwx    时间: 2022-3-17 10:00
6666666666666666666666
作者: abc156720613    时间: 2022-4-22 01:37
试试看,正好需要
作者: ABC163    时间: 2022-4-27 18:32
大佬,下载学习看看
作者: ojajo    时间: 2022-5-17 15:39
Scanf1 发表于 2022-1-19 11:02
楼主大佬你好,最近在研究yolov5方面,然后需要能快速截屏,于是搜到了你这个帖子,但是从python调用这个dl ...

DXGI截取到的像素点阵数据已保存在“m_bin”处,像素排列顺序为:BGRA,BGAR ... BGRA
现想要得到一张BMP32的截图,只需要要构建:位图文件头、位图信息头
然后合成一张完整的BMP32位图:位图文件头 + 位图信息头 + m_bin = BMP32.bmp
当然,“m_bin”保存的像素点阵是上下翻转了的,在合成位图之前,花点心思把它翻转过来即可。
作者: 出发loli机1号    时间: 2022-6-1 22:59
官方首发各地广泛但是
作者: 出发loli机1号    时间: 2022-6-1 22:59
繁多的房租上涨幅度是
作者: 出发loli机1号    时间: 2022-6-1 23:00
电风扇犯得上犯得上脂肪酸的
作者: 出发loli机1号    时间: 2022-6-6 21:07
规范化规范化广泛
作者: 出发loli机1号    时间: 2022-6-6 21:08
和规范化规范化官方
作者: 出发loli机1号    时间: 2022-6-6 21:08
的说法范德萨 范德萨fds
作者: q519584784    时间: 2022-6-10 08:40
有网友反馈有内存泄露问题,已经更新,见75楼
作者: 必兮相语    时间: 2022-7-5 10:11
你好:dxgi为什么不能与窗口收缩呀?
作者: jia201314973    时间: 2022-8-26 12:34

作者: 2547978337    时间: 2022-8-30 16:01
213213123123123
作者: 不苦小和尚    时间: 2022-9-14 05:48
啪啪啪么么哒 发表于 2021-12-20 15:47
修复了可能的内存泄露问题,增加抓屏超时参数,如还有相关问题请回帖反馈
...

谢谢分享,不错不错
作者: 不苦小和尚    时间: 2022-9-14 05:49
Xiaochuzhang 发表于 2022-1-30 19:04
**** 作者被禁止或删除 内容自动屏蔽 ****

这个没有快照快?。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4