Windows gdi 屏幕采集

2024-08-29 05:58
文章标签 windows 采集 屏幕 gdi

本文主要是介绍Windows gdi 屏幕采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Windows开发有时需要实现截屏、桌面推送功能,网上搜的方案大多为ffmpeg实现。如果这个功能要放在sdk则引入的ffmpeg会导致模块体积太大。我参考ffmepg截屏部分的源码,在Windows上用的是gdi bitblt截屏,这完全可以自己用gdi实现一个截屏模块。最终实现如下,整个功能模块只依赖于<Windows.h>头文件,效果与ffmpeg基本一致,如果不是追求极致性能(mirro driver、duplication)的截屏,这种实现还是有价值的。下面是头文件的定义:

#pragma once
#include"IVideoCapture.h"
/************************************************************************
* @Project:      GdiScreenCapture
* @Decription:  Gdi屏幕采集工具
* @Verision:      v1.0.0.1
* @Author:      Xin 
* @Create:      2020/3/12 16:26:00
* @LastUpdate:  2020/4/03 15:24:00
************************************************************************
* Copyright @ 2020. All rights reserved.
************************************************************************/
namespace Common{
/// <summary>
/// Gdi屏幕采集对象
/// </summary>
class  GdiScreenCapture:IVideoCapture
{
public:    /// <summary>/// 采集区域的模式/// </summary>enum RectMode {/// <summary>/// 按实际计算/// </summary>TrueValue,/// <summary>/// 按比例计算/// </summary>RatioValue};    
public:/// <summary>/// 构造函数/// </summary>/// <param name="callback">[in]回调接口对象</param>/// <param name="hwnd">[in]窗口句柄,为NULL时采集屏幕</param>/// <param name="format">[in]输出的像素格式</param>GdiScreenCapture(void* hwnd, PixelFormat format);/// <summary>/// 析构函数/// </summary>~GdiScreenCapture();// 通过 IVideoCapture 继承virtual void SetCallback(Common::IVideoCaptureCallback *) override;/// <summary>/// 设置采集区域,可动态设置 -线程安全/// </summary>/// <param name="x">[in]x坐标</param>/// <param name="y">[in]x坐标</param>/// <param name="width">[in]宽</param>/// <param name="height">[in]高</param>/// <param name="rectMode">[in]采集区域计算方式。TrueValue为实际值。RatioValue为比例值范围0-1,全屏设为0,0,1,1。</param>void SetRect(float x, float y, float width, float height, RectMode rectMode);/// <summary>/// 设置采集帧率,可动态设置 -线程安全/// </summary>/// <param name="framerate">采集帧率fps</param>void SetFramerate(float framerate);/// <summary>/// 开启采集/// </summary>void Start();/// <summary>/// 停止采集/// </summary>void Stop();/// <summary>/// 快照图片缓存/// </summary>/// <param name="hwnd">[in]窗口句柄,为NULL时采集屏幕</param>/// <param name="x">[in]x坐标</param>/// <param name="y">[in]y坐标</param>/// <param name="width">[in]宽</param>/// <param name="height">[in]高</param>/// <param name="format">[in]输出的像素格式</param>/// <param name="buf">[in]图片缓存,由调用者初始化</param>/// <param name="len">[in]图片缓存的长度,由调用者提供</param>/// <returns>返回图像数据的长度</returns>static int  Snapshot(void* hwnd, int x, int y, int width, int height, PixelFormat  format, unsigned char* buf, size_t len);/// <summary>/// 快照保存文件,bmp格式/// </summary>/// <param name="hwnd">[in]窗口句柄,为NULL时截取屏幕</param>/// <param name="x">[in]x坐标</param>/// <param name="y">[in]y坐标</param>/// <param name="width">[in]宽</param>/// <param name="height">[in]高</param>/// <param name="filename">[in]保存的文件名</param>static void Snapshot(void* hwnd, int x, int y, int width, int height, const  char* filename);
private:void*_implement;};
}

 采用pimp的设计头文件依赖较少,功能上支持:设置截屏的窗口句柄,设置截屏帧率,设置输出格式(bgr24、yu12、nv12等)。具体项目如下:

https://download.csdn.net/download/u013113678/32905774

这篇关于Windows gdi 屏幕采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117036

相关文章

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

在 Windows 上安装 DeepSeek 的完整指南(最新推荐)

《在Windows上安装DeepSeek的完整指南(最新推荐)》在Windows上安装DeepSeek的完整指南,包括下载和安装Ollama、下载DeepSeekRXNUMX模型、运行Deep... 目录在www.chinasem.cn Windows 上安装 DeepSeek 的完整指南步骤 1:下载并安装

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

Windows如何添加右键新建菜单

Windows如何添加右键新建菜单 文章目录 Windows如何添加右键新建菜单实验环境缘起以新建`.md`文件为例第一步第二步第三步 总结 实验环境 Windows7 缘起 因为我习惯用 Markdown 格式写文本,每次新建一个.txt后都要手动修改为.md,真的麻烦。如何在右键新建菜单中添加.md选项呢? 网上有很多方法,这些方法我都尝试了,要么太麻烦,要么不凑效