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

【GDI/GDI+】如何抓取屏幕保存到bitmap文件?

问题

如何抓取屏幕保存到bitmap文件?

方法

GDI 方法

1、抓取。

HBITMAP CRectChartUI::GetBitmap(HDC hDC)
{HDC hMemDC;int x, y;int nWidth, nHeight;HBITMAP hBitmap, hOldBitmap;hMemDC = CreateCompatibleDC(hDC);nWidth = GetDeviceCaps(hDC, HORZRES);nHeight = GetDeviceCaps(hDC, VERTRES);hBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight);hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);BitBlt(hMemDC, 0, 0, nWidth, nHeight, hDC, 0, 0, SRCCOPY);hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);DeleteDC(hMemDC);return hBitmap;
}

2、保存bitmap文件函数

// 保存位图到文件
int CScreenshotsWnd::SaveBitmapToFile(HBITMAP hBitmap, LPCWSTR lpFileName)
{           WORD   wBitCount;   //位图中每个像素所占字节数     // 定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数     DWORD   dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten;BITMAP   Bitmap; //位图属性结构     BITMAPFILEHEADER   bmfHdr;   //位图文件头结构     BITMAPINFOHEADER   bi;   //位图信息头结构     HANDLE   fh;   //定义文件,分配内存句柄,调色板句柄   LPSTR   lpbk, lpmem;wBitCount = 32;//设置位图信息头结构     GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = Bitmap.bmWidth;bi.biHeight = Bitmap.bmHeight; //为负,正向的位图;为正,倒向的位图   bi.biPlanes = 1;bi.biBitCount = wBitCount;bi.biCompression = BI_RGB;bi.biSizeImage = 0;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;dwBmBitsSize = ((Bitmap.bmWidth*wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;//创建位图文件fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return   FALSE;//设置位图文件头     bmfHdr.bfType = 0x4D42;   //   "BM"     dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwBmBitsSize;bmfHdr.bfSize = dwDIBSize;bmfHdr.bfReserved1 = 0;bmfHdr.bfReserved2 = 0;bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);//写入位图文件头WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);//写入位图信息头   WriteFile(fh, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);//获取位图阵列lpmem = new   char[dwBmBitsSize];lpbk = (LPSTR)   new   char[dwBmBitsSize];GetBitmapBits(hBitmap, dwBmBitsSize, lpmem);//正向的内存图象数据  //转化为倒向数据(仅在bmHeight为正时需要)   for (int i = 0; i < Bitmap.bmHeight; i++){memcpy(lpbk + Bitmap.bmWidth*i * 4, lpmem + Bitmap.bmWidth*(Bitmap.bmHeight - i - 1) * 4, Bitmap.bmWidth * 4);}//写位图数据WriteFile(fh, lpbk, dwBmBitsSize, &dwWritten, NULL);//清除     delete[]lpbk;delete[]lpmem;CloseHandle(fh);return   TRUE;
}

3、调用方式

SaveBitmapToFile(GetBitmap(hDC), _T("d:\\debug\\1.bmp"));

GDI+方法

1、抓屏幕保存至文件。

BOOL CRectChartUI::SaveHDCToFile(HDC hDC, Gdiplus::Rect rc, LPCWSTR lpFileName)
{BOOL bRet = FALSE;//将目标区域贴图到内存BITMAPHDC hMemDC = CreateCompatibleDC(hDC);HBITMAP hBitmap = CreateCompatibleBitmap(hDC, rc.Width, rc.Height);SelectObject(hMemDC, hBitmap);BitBlt(hMemDC, 0, 0, rc.Width, rc.Height, hDC, rc.X, rc.Y, SRCCOPY);//保存成文件{//L"image/bmp" L"image/jpeg"  L"image/gif" L"image/tiff" L"image/png"CLSID pngClsid;GetEncoderClsid(L"image/bmp", &pngClsid);//此处以BMP为例,其它格式选择对应的类型,如JPG用L"image/jpeg" Gdiplus::Bitmap *pbmSrc = Gdiplus::Bitmap::FromHBITMAP(hBitmap, NULL);if (pbmSrc->Save(lpFileName, &pngClsid) == Gdiplus::Status::Ok){bRet = TRUE;}delete pbmSrc;}//清理工作SelectObject(hMemDC, (HBITMAP)NULL);DeleteDC(hMemDC);DeleteObject(hBitmap);return bRet;
}

 

2、检索编码器的类标识符

BOOL CRectChartUI::GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{UINT num = 0;                    //number of image encodersUINT size = 0;                   //size of the image encoder array in bytesint nRet;UINT i;ImageCodecInfo* pImageCodecInfo = NULL;nRet = GetImageEncodersSize(&num, &size);if (nRet != Gdiplus::Status::Ok){return FALSE;}pImageCodecInfo = (ImageCodecInfo*)(malloc(size));if (pImageCodecInfo == NULL){return FALSE;}GetImageEncoders(num, size, pImageCodecInfo);for (i = 0; i < num; i++){if (wcscmp(pImageCodecInfo[i].MimeType, format) == 0){*pClsid = pImageCodecInfo[i].Clsid;free(pImageCodecInfo);return TRUE;}}free(pImageCodecInfo);return FALSE;
}

 3、调用方式。

SaveHDCToFile(hDC, rc, _T("d:\\debug\\test.bmp"));

总结

1、GDI+保存文件种类可以选择bmp、jpeg等多种,GDI只能是bmp。

2、流程基本一致,但GDI保存需要自己实现。

参考:【GDI+】GetEncoderClsid()函数,检索编码器的类标识符_sunriver2000的博客-CSDN博客

相关文章:

【GDI/GDI+】如何抓取屏幕保存到bitmap文件?

问题 如何抓取屏幕保存到bitmap文件&#xff1f; 方法 GDI 方法 1、抓取。 HBITMAP CRectChartUI::GetBitmap(HDC hDC) {HDC hMemDC;int x, y;int nWidth, nHeight;HBITMAP hBitmap, hOldBitmap;hMemDC CreateCompatibleDC(hDC);nWidth GetDeviceCaps(hDC, HORZRES);nHei…...

HDFS介绍

目录 ​编辑 一、HDFS基础 1.1 概述 1.2 HDFS的设计目标 1.2.1 硬件故障 1.2.2 流式数据访问 1.2.3 超大数据集 1.2.4 简单的一致性模型 1.2.5 移动计算而不是移动数据 1.2.6 跨异构硬件和软件平台的可移植性 1.3 基础概念 1.3.1 块&#xff08;Block&#xff09; 1.3.2 复制…...

每日一题——两数之和

题目 给出一个整型数组 numbers 和一个目标值 target&#xff0c;请在数组中找出两个加起来等于目标值的数的下标&#xff0c;返回的下标按升序排列。 &#xff08;注&#xff1a;返回的数组下标从1开始算起&#xff0c;保证target一定可以由数组里面2个数字相加得到&#xff0…...

Maven: ‘mvn‘ is not recognized as an internal or external command

下载并配置好Maven之后&#xff0c;CMD测试安装是否成功&#xff1a;mvn -v 提示&#xff1a; mvn is not recognized as an internal or external command, operable program or batch file. 检查环境变量&#xff1a; MAVEN_HOME: %MAVEN_HOME%\bin: 看上去没问题&#x…...

CubeSLAM: Monocular 3D Object SLAM——论文简述

一、简介 提出一种在动态和静态环境中同时进行3D目标检测和定位建图的方法&#xff0c;并且能够互相提升准确度。具体地&#xff0c;对于3D目标&#xff0c;其位置、方向和尺寸通过slam进行了优化&#xff1b;而3D目标作为slam中的路标&#xff0c;可以提供额外的语义和几何约…...

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

linux scp 拷贝文件到目标linux系统

scp -P 8866 -r jsonrpc/ root192.168.6.66:/folder_path...

Oracle-expdp报错ORA-39077、06502(Bug-16928674)

问题: 用户在使用expdp进程导出时&#xff0c;出现队列报错ORA-39077、ORA-06502 ORA-31626: job does not exist ORA-31638: cannot attach to job SYS_EXPORT_SCHEMA_01 for user SYS ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$…...

Kafka入门,保姆级教学

文章目录 Kafka概念消息中间件对比消息中间件对比-选择建议Kafka常用名词介绍Kafka入门1. Kafka安装配置2.Kafka生产者与消费者关系3.Kafka依赖4.生产者发消息5.消费者接受消息6.Kafka高可用性设计6.1集群Kafka备份机制(Reolication) 7.kafka生产者详解7.1 发送类型7.2参数详解…...

RabbitMQ 过期时间(TTL)

TTL,Time to Live的简称&#xff0c;即过期时间&#xff0c;RabbitMQ可以对消息和队列设置TTL。 RabbitMQ支持设置队列的过期时间和消息的过期时间。如果设置队列的过期时间则队列中所有的消息都有相同的过期时间。如果设置消息的过期时间则每条消息的过期时间则可以不同。如两…...

C 语言练习题、持续更新

文章目录 C语言练习题读懂每个练习题才是学好一门代码的重要经历目录&#xff08;先不要看答案&#xff0c;首先自己做才能更好的领悟&#xff0c;做不来没关系&#xff09;题目一&#xff1a;有 1、2、3、4 四个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&…...

Android Q以上后台启动Activity初步尝试

在Android Q以后 google不允许在后台service 广播等等启动Activity 具体请看google文档从后台启动 Activity 的限制 | Android 开发者 | Android Developers 文档里有详细的说明,在哪种情况下可以后台启动Activity。 大体分为以下几种情况: 1、应用具有可见窗口,例如前…...

【torchlars】windows下载github中的torchlars包遇到的问题及解决方案

环境 python3.7 windows10 cuda11.1 pytorch1.8.1 虚拟环境miniconda 目的 windows下载github中的torchlars包 遇到的问题 问题一&#xff1a;直接下载好文件夹输入指令&#xff1a;python setup.py install 出现错误&#xff1a;RuntimeError: Error compiling objects f…...

SolidUI社区-通用Prompt技巧

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…...

C++中类的封装写出一个文件加密的小项目

文件的加密较为简单&#xff0c;当然也可以修改它的加密方式等&#xff0c;供大家参考 #include<string> #include<fstream> class ReaderFile { public:string Read(const string& filename){cout << "读取文件&#xff0c;获取明文"<<…...

【网络编程·传输层】UDP和TCP的报头

目录 一、端口号划分 二、部分指令 1、pidof&#xff08;用于查看进程id&#xff09; 2、netstat&#xff08;查看网络状态&#xff09; 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …...

C语言编程技巧 全局变量在多个c文件中公用的方法

在使用C语言编写程序时&#xff0c;经常会遇到这样的情况&#xff1a;我们希望在头文件中定义一个全局变量&#xff0c;并将其包含在两个不同的C文件中&#xff0c;以便这个全局变量可以在这两个文件中共享。举个例子&#xff0c;假设项目文件夹"project"下有三个文件…...

【HDFS】NN处理全量块汇报时reportDiff的一些细节

NN处理全量块汇报(FBR)时的一些细节怎么生成的toRemove怎么check 汇报上来的块是不是corrupt的?reportDiff方法里巧妙地引入delimiterBlock这个block的作用前置知识:【HDFS】Block、BlockInfo、BlockInfoContiguous、BlockInfoStriped的分析记录 上面的文章中介绍了关于Bl…...

JVM之类加载与字节码(一)

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […...

【数据结构OJ题】合并两个有序数组

原题链接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 看到这道题&#xff0c;我们注意到nums1[ ]和nums2[ ]两个数组都是非递减的。所以我们很容易想到额外开一个数组tmp[ ]&#x…...

专业级图片去重神器:彻底告别重复照片的数字困扰

专业级图片去重神器&#xff1a;彻底告别重复照片的数字困扰 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾经花费数小时手动整理电脑中堆积如山的重复照片&a…...

摩尔线程MUSA生态到底解决了什么,没解决什么?——一个开发者的迁移权衡手记

摩尔线程MUSA生态到底解决了什么&#xff0c;没解决什么&#xff1f;——一个开发者的迁移权衡手记 先说结论MUSA对CUDA的100%兼容更多是API层面的&#xff0c;解决的是代码能不能跑的问题&#xff0c;但实际性能调优和热点算子库的成熟度才是决定“跑得快不快”的关键。进入SG…...

对比使用Taotoken前后在模型API费用支出上的月度观察

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比使用Taotoken前后在模型API费用支出上的月度观察 作为一名个人开发者&#xff0c;我日常的开发工作离不开大语言模型的辅助&am…...

剪映专业版教程:制作数据结构快速排序算法原理演示视频

前言 今天教大家用剪映制作数据结构快速排序算法的原理演示视频。一趟冒泡排序只能使一个元素排序到位&#xff0c;而快速排序在一趟操作后不仅能使某个元素排序到位&#xff0c;还能将序列划分为两个子序列——所有比该元素小的都在左边&#xff0c;所有比该元素大的都在右边…...

Notepad2-mod终极指南:掌握这款高效开源文本编辑器的深度开发与扩展

Notepad2-mod终极指南&#xff1a;掌握这款高效开源文本编辑器的深度开发与扩展 【免费下载链接】notepad2-mod LOOKING FOR DEVELOPERS - Notepad2-mod, a Notepad2 fork, a fast and light-weight Notepad-like text editor with syntax highlighting 项目地址: https://gi…...

[寻找时间序列数据中异常值终极指南(第三部分)](https://towardsdatascience.com/the-ultimate-guide-to-finding-outliers-in-yo

原文&#xff1a;towardsdatascience.com/the-ultimate-guide-to-finding-outliers-in-your-time-series-data-part-3-0ff73ce28ca3...

别再只会画矩形了!用Leaflet+L.geoJSON搞定复杂行政区遮罩(含飞地处理)

突破Leaflet遮罩技术瓶颈&#xff1a;复杂行政区与飞地处理的终极方案 当我们面对真实世界中的行政区划数据时&#xff0c;理想化的矩形遮罩显得力不从心。中国行政区划的复杂性——飞地、嵌套洞、不规则边界——要求开发者掌握更高级的地图遮罩技术。本文将带您深入Leaflet的L…...

工厂实验室建设公司厂家:建不好,产品质量白搞|中南实验室建设

在工业4.0浪潮席卷全球的今天&#xff0c;工厂实验室早已不是传统意义上"摆几台仪器、刷几面墙"的简单工程。它是企业质量管控的第一道闸门&#xff0c;是工艺优化的数据引擎&#xff0c;更是技术创新的核心载体。从新能源电池的毫秒级安全测试&#xff0c;到半导体工…...

猫抓Cat-Catch终极指南:从浏览器资源嗅探到流媒体下载的完整解决方案

猫抓Cat-Catch终极指南&#xff1a;从浏览器资源嗅探到流媒体下载的完整解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓Cat-Catch是一…...

京东评论 API 实战:JSON 数据结构、字段含义与解析技巧

一、接口实战前置说明该接口为京东商品评论数据调取接口&#xff0c;支持获取商品全部用户评价、晒图、追评、星级评分、规格选购信息等&#xff0c;统一返回标准 JSON 格式&#xff0c;可用于竞品数据分析、舆情监控、评论内容采集、电商数据分析、商品口碑测评等开发场景&…...