提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、DXGI
    • 1.微软官方资源(都是C++语言)
    • 2.github示例(都是C++语言)
  • 二、基于github示例封装的dll文件
  • 三、C#调用DesktopDuplication.dll文件
    • 1.使用流程:
    • 2.封装屏幕采集大致流程:
    • 3.C#调用示例:
  • 总结

前言

Microsoft DirectX 图形基础结构 (DXGI) 处理枚举图形适配器、枚举显示模式、选择缓冲区格式、在进程之间共享资源 (,例如,应用程序与桌面窗口管理器 (DWM) ) 之间,以及向窗口或监视器显示呈现的帧。
本文章,主要是介绍C#使用封装好的 DXGI 采集桌面,比起传统的GDI方式,要强大很多。


一、DXGI

1.微软官方资源(都是C++语言)

点我穿越

2.github示例(都是C++语言)

点我穿越


二、基于github示例封装的dll文件

DesktopDuplication.dll下载
C++能力有限,封装的dll功能和性能都不及原github示例,测试截图正常,有能力的同学可以参考官网和github示例DIY。

三、C#调用DesktopDuplication.dll文件

1.使用流程:

将DesktopDuplication.dll下载到输出文件同级目录下,再把GXDI录屏相关代码复制到你的项目中,直接调用screenShotGXDI()方法即可。

2.封装屏幕采集大致流程:

C#通过线程初始化DesktopDuplication.dll进行屏幕采集再通过委托将DXGI采集的屏幕数据传给C#(多屏幕时通过屏幕号辨别数据是哪块屏幕)

3.C#调用示例:

     #region GXDI录屏相关代码public delegate void CallbackDelegate(IntPtr Image, int width, int height, int RowPitch, int ScreenNumber);//声明委托//接口定义[DllImport("DesktopDuplication.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]public static extern void SetRegisterFunctionCallback(CallbackDelegate callback);[DllImport("DesktopDuplication.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]public static extern int Initialize();[DllImport("DesktopDuplication.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]private static extern int SetSwitch(int type);public CallbackDelegate callbackDelegate = new CallbackDelegate(CallBackFunction);[HandleProcessCorruptedStateExceptions]public static void CallBackFunction(IntPtr Image, int width, int height, int RowPitch, int ScreenNumber){try{Bitmap bitmap = new Bitmap(width, height, RowPitch, PixelFormat.Format32bppRgb, Image);//通过指针得到指定图片Bitmap thumbnailimage = ThumbnailImage(bitmap, 100, 100);//计算缩量图//ScreenNumber 屏幕号}catch (Exception ex){Console.Write(ex.Message);}Thread.Sleep(30);}private void screenShotGXDI(){try{SetRegisterFunctionCallback(callbackDelegate);Task task = new Task(() =>{Initialize();});task.Start();}catch (Exception ex){DataView.PublicHandle.log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name, "DXGI Load Error:" + ex.Message);}}/// <summary>/// 生成缩略图/// </summary>/// <param name="img">原图</param>/// <param name="maxHeight">最大高度</param>/// <param name="maxWidth">最大宽度</param>public static Bitmap ThumbnailImage(Bitmap img, int maxHeight, int maxWidth){ImageFormat thisFormat = img.RawFormat;//缩略图尺寸double w = 0.0;                              //图片的宽double h = 0.0;                              //图片的高double sw = Convert.ToDouble(img.Width);double sh = Convert.ToDouble(img.Height);double mw = Convert.ToDouble(maxWidth);double mh = Convert.ToDouble(maxHeight);if (sw < mw && sh < mh){w = sw;h = sh;}else if ((sw / sh) > (mw / mh)){w = maxWidth;h = (w * sh) / sw;}else{h = maxHeight;w = (h * sw) / sh;}System.Drawing.Size newSize = new System.Drawing.Size(Convert.ToInt32(w), Convert.ToInt32(h));Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height);Graphics g = Graphics.FromImage(outBmp);//设置画布的描绘质量g.CompositingQuality = CompositingQuality.HighQuality;g.SmoothingMode = SmoothingMode.HighQuality;g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);g.Dispose();return outBmp;}#endregion

总结

从 Windows 8 开始,微软引入了一套新技术叫 Desktop Duplication API,应用程序可以通过这套 API 请求桌面的图形数据。
优点:由于 Desktop Duplication API 是通过 DirectX Graphics Infrastructure(以下简称 DXGI)来提供桌面图像的,竞争的是 GPU 流水线资源,所以 CPU 占用率很低,采集性能非常高。
缺点:不支持Windows8前的系统。
参考资料:
【技术分享】Windows桌面端录屏采集实现教程

C# 调用DXGI采集屏幕相关推荐

  1. signaltap采集数据到matlab,一种matlab调用signaltap采集数据的方法

    最近,在利用FPGA采集数据,前端是通过AD采集,然后直接输出给FPGA,需要分析采集到的数据,通常的办法只能在signaltap中,右击信号列表然后点击"Create SignalTap ...

  2. matlab signaltap,一种matlab调用signaltap采集数据的方法

    [导读] 一种matlab调用signaltap采集数据的方法关键词: AD采集MatlabFPGA 最近,在利用FPGA采集数据,前端是通过AD采集,然后直接输出给FPGA,需要分析采集到的数据,通 ...

  3. H5 MediaDevices方法,调用摄像头、屏幕录像功能

    使用浏览器调用电脑得 摄像头功能 这次公司得项目需求,让我完成一个功能,当有电脑摄像头时,就使用,如果没有那么就使用屏幕得录像功能 首先是语法: 可以参考一下MDN 申明,以下代码凡是用到this.变 ...

  4. ubuntu下安装大恒相机驱动并调用程序采集图像

    一.ubuntu下安装大恒相机驱动 1.大恒GigE摄像头Ubuntu环境下的配置 大恒GigE摄像头Ubuntu环境下的配置 - Tzbubble - 博客园 2.官方的Linux版SDK常见问题解 ...

  5. vc++ 调用winapi调节屏幕亮度

    自己封装了一个类,方便以后使用. 自己是在win7上完成的测试,发现可以.博文是在Mac上写的,代码可能存在错误,请见谅,我会放上图片. 1.包含头文件 #include <physicalmo ...

  6. 毛星云opencv入门调用摄像头采集图像

    #include<opencv2/opencv.hpp>#include<iostream> using namespace std; using namespace cv; ...

  7. Windows平台RTMP直播推送集成简要说明

    好多开发者在集成大牛直播SDK (官方)的Windows平台RTMP推送模块时吓一跳,怎么这么多接口?本文做个简单的拆分: 初始化 初始化之前,如需设置日志路径,调用NTSmartLog.NT_SL_ ...

  8. Windows平台RTMP/RTSP直播推送模块设计和使用说明

    开发背景 好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们设计的W ...

  9. [轻量级RTSP服务]Linux|麒麟操作系统下实现屏幕|系统声音采集

    背景 随着国产操作系统的推进,传统行业对Linux平台的呼声和需求越来越大,之前几年,我们发布了Linux平台运营商级的RTSP转RTMP推送模块.RTMP推送模块和RTSP.RTMP播放模块,前段时 ...

最新文章

  1. PHP操作Redis步骤详解
  2. linux安装weblogic9,linux_weblogic9_安装说明.doc
  3. MFC-使用自定义控件的方法
  4. 『ACM-算法-图论』算法竞赛进阶指南--hamilton路径(模板)
  5. 解决Maven管理项目update Maven时,jre自动变为1.5
  6. shell编程中date用法(转)
  7. 2017.7.8 MS SQL Server and BI workshop
  8. openstack排错
  9. Java 进制转换函数
  10. 软件开发过程与项目管理(5.软件项目任务分解)
  11. Latex 语法 备忘录
  12. 一文讲透小石头Little Stone:Web3时代Gravatar、中国版BAYC、平台NFT、社区门票
  13. 用了 DDD 以后,代码更难懂了?看完这篇你就明白了
  14. 磁盘及文件系统管理详解
  15. 北京功略----购物篇
  16. 微信购物直播商城渠道定制开发
  17. PON与EPON以及GPON的区别是什么?
  18. Python网络爬虫实战项目代码大全
  19. 用matlab模拟机械运动
  20. stm32上电不复位,需手动复位问题。

热门文章

  1. 脑裂是什么,zk是如何解决脑裂问题的
  2. L6 U5 商务方案
  3. IDEA 里 Build、Rebuild、Recompile 的区别
  4. python散点图图例显示标记点类型_python – matplotlib散点图中的标记点
  5. 本土程序员杀进硅谷的第一步---突破英语瓶颈
  6. MD5加密,16位加密,32位加密,Base64加密,解密
  7. 数据分析、数据挖掘、机器学习实习面经总结
  8. Weblogic服务器证书安装配置 | Weblogic SSL
  9. python实训报告5000字_测量实训报告范文5000字
  10. 国密:SM2公私钥加签验签