当前位置: 首页 > article >正文

C++ Windows下屏幕截图

屏幕截图核心代码(如果要求高帧率,请使用DxGI):

// RGB到YUV的转换公式
#define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) + (0.587 * (g)) + (0.114 * (b))))
#define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) + (0.500 * (b)) + 128))
#define RGB_TO_V(r, g, b) ((int)((0.500 * (r)) - (0.419 * (g)) - (0.081 * (b)) + 128))// 假设输入图像是32位ARGB,宽度为width,高度为height,如果是图像是RGB,下面像素位数4改为3即可
void ConvertRGBToYUV420P(unsigned char* rgbData, int width, int height, unsigned char* yuvData)
{int ySize = width * height;int uvSize = width * height / 4;// 填充Y分量for (int i = 0; i < height; ++i){for (int j = 0; j < width; ++j){int index = i * width + j;yuvData[index] = RGB_TO_Y(rgbData[index * 4], rgbData[index * 4 + 1], rgbData[index * 4 + 2]);}}// 填充U和V分量(下采样)int uvIndex = ySize;for (int i = 0; i < height; i += 2){for (int j = 0; j < width; j += 2){int rgbIndex = i * width + j;yuvData[uvIndex++] = RGB_TO_U(rgbData[rgbIndex * 4], rgbData[rgbIndex * 4 + 1], rgbData[rgbIndex * 4 + 2]);}}for (int i = 0; i < height; i += 2){for (int j = 0; j < width; j += 2){int rgbIndex = i * width + j;yuvData[uvIndex++] = RGB_TO_V(rgbData[rgbIndex * 4], rgbData[rgbIndex * 4 + 1], rgbData[rgbIndex * 4 + 2]);}}
}void SaveYUV420P(const char* filename, unsigned char* yuvBuffer, int width, int height)
{FILE* file = fopen(filename, "wb");if (!file){AfxMessageBox(_T("Failed to open file for writing!"));return;}int frameSize = width * height * 3 / 2;fwrite(yuvBuffer, 1, frameSize, file);fclose(file);
}void SaveHBitmapToBmpFile(HBITMAP hBitmap, CString path)
{// 定义文件头结构BITMAPFILEHEADER fileHead;int fileHeadLen = sizeof(BITMAPFILEHEADER);// 定义图象信息结构BITMAPINFOHEADER bmpHead;int bmpHeadLen = sizeof(BITMAPINFOHEADER);// 获取HBITMAP对象信息BITMAP bmpObj;GetObject(hBitmap, sizeof(BITMAP), &bmpObj);// 计算文件总的字节大小DWORD fileSizeInByte;CDC srcDC;srcDC.CreateDC(L"DISPLAY", NULL, NULL, NULL);DWORD PixelSizeInBit = srcDC.GetDeviceCaps(BITSPIXEL) * srcDC.GetDeviceCaps(PLANES);fileSizeInByte = fileHeadLen + bmpHeadLen + bmpObj.bmWidth * bmpObj.bmHeight * PixelSizeInBit / 8;// 初始化文件头结构fileHead.bfOffBits = fileHeadLen + bmpHeadLen;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;fileHead.bfSize = fileSizeInByte;fileHead.bfType = 0x4D42; // 'BM'// 初始图像信息结构bmpHead.biBitCount = PixelSizeInBit;bmpHead.biClrImportant = 0;bmpHead.biClrUsed = 0;bmpHead.biCompression = BI_RGB;bmpHead.biHeight = -bmpObj.bmHeight;//图像数据颠倒处理bmpHead.biPlanes = 1;bmpHead.biSize = bmpHeadLen;bmpHead.biSizeImage = bmpObj.bmWidth * bmpObj.bmHeight * PixelSizeInBit / 8;bmpHead.biWidth = bmpObj.bmWidth;bmpHead.biXPelsPerMeter = 0;bmpHead.biYPelsPerMeter = 0;// 创建并打开BMP文件CFile file;if (!file.Open(path, CFile::modeCreate | CFile::modeWrite)){// 处理文件打开失败的情况return;}// 写入文件头和图象信息头file.Write(&fileHead, fileHeadLen);file.Write(&bmpHead, bmpHeadLen);// 获取位图数据并写入文件BYTE* pBitmapBits = NULL;BITMAPINFO bmpInfo;ZeroMemory(&bmpInfo, sizeof(BITMAPINFO));bmpInfo.bmiHeader = bmpHead;HDC hDC = GetDC(NULL);HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDC, hBitmap);pBitmapBits = new unsigned char[bmpHead.biSizeImage];int nBits = GetDIBits(hDC, hBitmap, 0, bmpObj.bmHeight, pBitmapBits, &bmpInfo, DIB_RGB_COLORS);file.Write(pBitmapBits, bmpHead.biSizeImage);// 转换RGB到YUV420Punsigned char* yuvBuffer = new unsigned char[bmpObj.bmWidth * bmpObj.bmHeight * 3 / 2];ConvertRGBToYUV420P(pBitmapBits, bmpObj.bmWidth, bmpObj.bmHeight, yuvBuffer);SaveYUV420P("d:\\a.yuv", yuvBuffer, bmpObj.bmWidth, bmpObj.bmHeight);delete[] yuvBuffer;// 恢复原来的位图对象并释放资源SelectObject(hDC, hOldBitmap);ReleaseDC(NULL, hDC);delete[] pBitmapBits;// 关闭文件file.Close();
}// 获取屏幕截图
HBITMAP CaptureScreen()
{HDC hScreen = GetDC(NULL);HDC hDC = CreateCompatibleDC(hScreen);int width = GetSystemMetrics(SM_CXSCREEN);int height = GetSystemMetrics(SM_CYSCREEN);HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, width, height);SelectObject(hDC, hBitmap);BitBlt(hDC, 0, 0, width, height, hScreen, 0, 0, SRCCOPY);DeleteDC(hDC);ReleaseDC(NULL, hScreen);return hBitmap;
}void CaptureAndSaveScreenAsYUV420P(const char* filename)
{HBITMAP hBitmap = CaptureScreen();SaveHBitmapToBmpFile(hBitmap, _T("d:\\a.bmp"));DeleteObject(hBitmap);
}CaptureAndSaveScreenAsYUV420P("d:\\a.yuv");

该代码包含了抓取屏幕数据获取到HBITMAP对象,并根据HBITMAP对象获取到RGB数据,RGB数据可以保存bmp文件,也可以转换YUV420P后进行图像编码,具体如何使用,各取所需吧。

相关文章:

C++ Windows下屏幕截图

屏幕截图核心代码&#xff08;如果要求高帧率&#xff0c;请使用DxGI&#xff09;&#xff1a; // RGB到YUV的转换公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …...

月结保障:回滚慢、行锁频发

问题背景 3.1号月结现场保障&#xff0c;到场了先让kill了一个账务的会话&#xff0c;回滚了20min&#xff0c;巡检的时候发现报表库有几条行锁&#xff1a;enq: TX - row lock contention&#xff0c;sql&#xff1a;delete from table_name 语句已经失败&#xff0c;正在回滚…...

Golang的微服务服务发现机制

## 1. Golang微服务服务发现机制 微服务架构已经成为当今软件开发的主流趋势&#xff0c;它能将复杂的单体应用拆分成小而独立的服务单元&#xff0c;实现更快的开发、部署和扩展。在微服务架构中&#xff0c;服务发现是非常重要的一环&#xff0c;它能够实现服务之间的自动发现…...

Keepalived 入门详解:高可用集群部署最佳实践!

1. 什么是 Keepalived&#xff1f; 在分布式集群中&#xff0c;单点故障&#xff08;SPOF&#xff09; 是影响系统稳定性的重要问题。Keepalived 作为一款高可用服务软件&#xff0c;可以有效防止集群单点故障&#xff0c;保障系统的高可用性。 Keepalived 最初是为 LVS&#…...

SparkStreaming之04:调优

SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...

开发博客系统

前言 准备工作 数据库表分为实体表和关系表 第一&#xff0c;建数据库表 然后导入前端页面 创建公共模块 就是统一返回值&#xff0c;异常那些东西 自己造一个自定义异常 普通类 mapper 获取全部博客 我们只需要返回id&#xff0c;title&#xff0c;content&#xff0c;us…...

微信小程序上如何使用图形验证码

1、php服务器生成图片验证码的代码片段如下&#xff1a; 注意红框部分的代码&#xff0c;生成的是ArrayBuffer类型的二进制图片 2、显示验证码 显示验证码&#xff0c;不要直接image组件加上src显示&#xff0c;那样拿不到cookie&#xff0c;没有办法做图形验证码的验证&…...

IntelliJ IDEA 构建项目时内存溢出问题

问题现象 在使用 IntelliJ IDEA 构建 Java 项目时&#xff0c;遇到了以下错误&#xff1a; java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space这是一个典型的 Java 堆内存不足错误&#xff0c;表…...

大模型微调与RAG检索增强技术深度解析

一、引言 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;如BERT、GPT等&#xff09;在自然语言处理、计算机视觉等领域取得了显著成效。然而&#xff0c;这些预训练好的大模型往往难以直接应用于特定业务场景&#xff0c;因此&#xff0c;大模型微调&#xff08;F…...

[liorf_localization_imuPreintegration-2] process has died

使用liorf&#xff0c;编译没报错&#xff0c;但是roslaunch报错如下&#xff1a; 解决方法&#xff1a; step1: 如果你之前没有安装 GTSAM&#xff0c;可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…...

2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)

首先到官网上下载安装包&#xff1a;http://www.mysql.com 点击下载&#xff0c;拉到最下面&#xff0c;点击社区版下载 windows用户点击下面适用于windows的安装程序 点击下载&#xff0c;网络条件好可以点第一个&#xff0c;怕下着下着断了点第二个离线下载 双击下载好的安装…...

数列极限入门习题

数列极限入门习题 lim ⁡ n → ∞ ( 1 1 2 1 3 ⋯ 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim​(121​31​⋯n1​)n1​ lim ⁡ n → ∞ ( 1 n 1 1 n 2 ⋯ 1 n n ) \lim\limits_{n\rightarrow\…...

【Python/Pytorch】-- 创建3090Ti显卡所需环境

文章目录 文章目录 01 服务器上&#xff0c;存在三个anaconda&#xff0c;如何选择合适的&#xff0c;创建python环境&#xff1f;02 conda、anaconda、cuda、cudnn区别03 用到一些指令04 如何指定cuda的版本&#xff1f;05 conda跟pip的区别&#xff1f;06 pycharm控制台07 服…...

如何在无图形化界面的服务器上下载百度网盘的超大文件(10GB以上)?

目录 登录百度网盘账号 进入特定的文件夹 下载 完整教程 登录百度网盘账号 第一次登录的时候会展示&#xff1a; Please visit: https://openapi.baidu.com/oauth/2.0/authorize?client_idxxx And authorize this app Paste the Authorization Code here within 10 minut…...

AI应用测试:遇到类ChatGPT的流式接口要如何压测?

先说结论: 使用最普遍的JMeter 就能支持类 OpenAI 的流式接口(如 ChatGPT 的流式聊天接口)的测试 总体设置 JMeter 支持测试 OpenAI 的流式接口,但需要额外配置(如启用 KeepAlive 和调整超时)。如果需要实时处理流式响应,使用 Regular Expression Extractor 或自定义脚…...

Linux磁盘情况查询

一、查询系统整体磁盘使用情况 1、基本语法 df -h 2、示例 二、查询指定目录的磁盘占用情况 1、基本语法 du -h 查询指定目录的磁盘占用情况&#xff0c;默认为当前目录 2、常用选项 选项 说明 -h 以人类可读的格式显示磁盘使用情况&#xff08;例如&#xff0c;KB、…...

数据库原理3

1.在SQL中&#xff0c;外模式对应于试图(VIEW)和部分基本表;模式对应于基本表;内模式对应于存储文件。 2.FETCH&#xff1a;实施游标推进 3.数据操纵&#xff1a;insert,update,delete 数据控制&#xff1a;grant,revoke 数据定义&#xff1a;create,drop,alter 4.物理结构…...

【3D格式转换SDK】HOOPS Exchange技术概览(二):3D数据处理高级功能

​ 在当今数字化工程领域&#xff0c;HOOPS Exchange作为一款强大的SDK&#xff0c;为3D工程应用程序的开发提供了关键支持。本文将深入剖析其基本组件、特定功能以及数据结构&#xff0c;带您全面了解这一驱动3D数据处理的核心工具。 一、概述 HOOPS Exchange专注于访问和重…...

利用Adobe Acrobat 实现PPT中图片分辨率的提升

1. 下载适用于 Windows 的 64 位 Acrobat 注册方式参考&#xff1a;https://ca.whu.edu.cn/knowledge.html?type1 2. 将ppt中需要提高分辨率的图片复制粘贴到新建的pptx问价中&#xff0c;然后执行“文件—>导出---->创建PDF、XPS文档” 3. 我们会发现保存下来的distrib…...

Python frozenset介绍

在 Python 中&#xff0c;frozenset 是一种不可变&#xff08;immutable&#xff09;的集合类型&#xff0c;它是 set 的不可变版本。与普通的 set 类型不同&#xff0c;frozenset 的内容一旦创建就不能被修改&#xff0c;这使得它在某些场景下非常有用。 1. 特点 不可变性&am…...

docer swarm集群部署springboot项目

1.准备两台服务器&#xff0c;安装好docker、docker-compose 因为用到了docker仓库&#xff0c;安装harbor,可以从github下载离线安装包 2. 我这边用到了gitlab-ci,整体流程也都差不多 1&#xff09;打包mvn clean install 2&#xff09;打镜像 docker-compose -f docker-compo…...

Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验

目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...

解决局域网访问Dify却仅显示nginx页面的问题

为什么dify在本机可以正常访问&#xff0c;局域网通过ip访问却只看到欢迎使用nginx的提示&#xff0c;如果访问服务器ip/apps则直接提示404 Not Found。这是怎么回事该如何解决呢&#xff1f;文章中将一步步解决这些问题。 前言 之前在服务器部署了dify&#xff0c;也在服务器…...

deepseek思考,谁是下一个deepseek?

这两天连续看了两篇某B站up关于AI的分析&#xff0c;也是感触很多 讲得内容咱先不说&#xff0c;讲得是真好。怎么说呢&#xff0c;就“活该人家能赚到钱”就对了。 第一篇&#xff0c;他说了一个事儿&#xff0c;就是AI未来的趋势&#xff0c;1000天内&#xff0c;代替世界上…...

从小米汽车召回看智驾“命门”:智能化时代 — 时间就是安全

2025年1月&#xff0c;小米因车辆“授时同步异常”召回3万余辆小米SU7&#xff0c;成为其造车历程中的首个重大安全事件。 从小米SU7召回事件剖析&#xff0c;授时同步何以成为智能驾驶的命门&#xff1f; 2024年11月&#xff0c;多名车主反馈SU7标准版的智能泊车辅助功能出现…...

OpenAI 最后一代非推理模型:OpenAI 发布 GPT-4.5预览版

最后一代非推理大模型 在人工智能领域&#xff0c;OpenAI 一直以其创新的技术和卓越的产品引领着行业的发展。近期&#xff0c;OpenAI 正式发布了 GPT-4.5 研究预览版。不仅如此&#xff0c;官方还宣称 GPT-4.5 被定位为 “最后一代非推理模型”&#xff0c;这一消息再次引起了…...

React Native国际化实践(react-i18next)

React Native国际化实践 一、主流国际化方案选择 react-i18next react-native-localize react-i18next&#xff1a;功能强大的国际化框架&#xff0c;支持复数、插值、嵌套等复杂语法&#xff0c;且与React无缝集成。react-native-localize&#xff1a;用于获取设备语言和地区…...

ioday2----->标准io函数

思维导图&#xff1a; 练习&#xff1a; 1将当前的时间写入到time. txt的文件中&#xff0c;如果ctrlc退出之后&#xff0c;在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止&#xff0c;再次执行程序 4.2022…...

竞争只属于失败者

“竞争只属于失败者”这一观点源自知名投资人、PayPal联合创始人彼得蒂尔&#xff08;Peter Thiel&#xff09;。他在斯坦福大学的创业课程中提出&#xff0c;成功的企业应追求垄断地位&#xff0c;而非陷入激烈的市场竞争。蒂尔认为&#xff0c;垄断使企业能够专注于长期发展和…...

【代码分享】基于IRM和RRT*的无人机路径规划方法详解与Matlab实现

基于IRM和RRT*的无人机路径规划方法详解与Matlab实现 1. IRM与RRT*的概述及优势 IRM&#xff08;Influence Region Map&#xff09;通过建模障碍物的影响区域&#xff0c;量化环境中的安全风险&#xff0c;为RRT算法提供启发式引导。RRT&#xff08;Rapidly-exploring Random…...