C# 调用DXGI采集屏幕
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、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采集屏幕相关推荐
- signaltap采集数据到matlab,一种matlab调用signaltap采集数据的方法
最近,在利用FPGA采集数据,前端是通过AD采集,然后直接输出给FPGA,需要分析采集到的数据,通常的办法只能在signaltap中,右击信号列表然后点击"Create SignalTap ...
- matlab signaltap,一种matlab调用signaltap采集数据的方法
[导读] 一种matlab调用signaltap采集数据的方法关键词: AD采集MatlabFPGA 最近,在利用FPGA采集数据,前端是通过AD采集,然后直接输出给FPGA,需要分析采集到的数据,通 ...
- H5 MediaDevices方法,调用摄像头、屏幕录像功能
使用浏览器调用电脑得 摄像头功能 这次公司得项目需求,让我完成一个功能,当有电脑摄像头时,就使用,如果没有那么就使用屏幕得录像功能 首先是语法: 可以参考一下MDN 申明,以下代码凡是用到this.变 ...
- ubuntu下安装大恒相机驱动并调用程序采集图像
一.ubuntu下安装大恒相机驱动 1.大恒GigE摄像头Ubuntu环境下的配置 大恒GigE摄像头Ubuntu环境下的配置 - Tzbubble - 博客园 2.官方的Linux版SDK常见问题解 ...
- vc++ 调用winapi调节屏幕亮度
自己封装了一个类,方便以后使用. 自己是在win7上完成的测试,发现可以.博文是在Mac上写的,代码可能存在错误,请见谅,我会放上图片. 1.包含头文件 #include <physicalmo ...
- 毛星云opencv入门调用摄像头采集图像
#include<opencv2/opencv.hpp>#include<iostream> using namespace std; using namespace cv; ...
- Windows平台RTMP直播推送集成简要说明
好多开发者在集成大牛直播SDK (官方)的Windows平台RTMP推送模块时吓一跳,怎么这么多接口?本文做个简单的拆分: 初始化 初始化之前,如需设置日志路径,调用NTSmartLog.NT_SL_ ...
- Windows平台RTMP/RTSP直播推送模块设计和使用说明
开发背景 好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们设计的W ...
- [轻量级RTSP服务]Linux|麒麟操作系统下实现屏幕|系统声音采集
背景 随着国产操作系统的推进,传统行业对Linux平台的呼声和需求越来越大,之前几年,我们发布了Linux平台运营商级的RTSP转RTMP推送模块.RTMP推送模块和RTSP.RTMP播放模块,前段时 ...
最新文章
- PHP操作Redis步骤详解
- linux安装weblogic9,linux_weblogic9_安装说明.doc
- MFC-使用自定义控件的方法
- 『ACM-算法-图论』算法竞赛进阶指南--hamilton路径(模板)
- 解决Maven管理项目update Maven时,jre自动变为1.5
- shell编程中date用法(转)
- 2017.7.8 MS SQL Server and BI workshop
- openstack排错
- Java 进制转换函数
- 软件开发过程与项目管理(5.软件项目任务分解)
- Latex 语法 备忘录
- 一文讲透小石头Little Stone:Web3时代Gravatar、中国版BAYC、平台NFT、社区门票
- 用了 DDD 以后,代码更难懂了?看完这篇你就明白了
- 磁盘及文件系统管理详解
- 北京功略----购物篇
- 微信购物直播商城渠道定制开发
- PON与EPON以及GPON的区别是什么?
- Python网络爬虫实战项目代码大全
- 用matlab模拟机械运动
- stm32上电不复位,需手动复位问题。