引言

最近有一个需要截取当前屏幕,并保存成BMP文件的需求。整个需求,拆分成三步:1、截取屏幕,获得位图数据。2、配合bmp文件结构信息,将数据整合。3、对整合后的数据做操作,如保存在本地、通过网络传送至服务器等。

截屏

我选用的是BitBlt这个windows API作为截取图片的方法,该方法的详细信息参考这里,详细代码如下:

首先获得屏幕的HDC,通过GetDC()这个API,接着创建一个兼容HDC,即comHDC,用来在内存里表示截取的位图的上下文。 后面两行代码分别是获得屏幕的宽度和高度。然后用CreateCompatibleBitmap这个API创建一个兼容的HBITMAP,即我们的位图句柄。创建好后,我们将其作为comHDC的选中位图句柄(在这里,我不知道怎么措辞了,如果专门的措辞,请告知。)。然后调用BitBlt,将hDC即屏幕的位图复制到comHDC即hBitmap中。至此,我们已经获得到所需位图数据的全部信息。

BMP文件结构信息

bmp文件需由三部分组成:文件头(BITMAPFILEHEADER),位图信息头(BITMAPINFOHEADER)、位图数据。我们将这所有的数据写入硬盘的时候,需要按照顺序依次将三个部分写入。文件头和位图信息头是按照HBitmap以及它的HDC来构造的。构造文件头的代码如下:

其中width和height为上文得到的屏幕宽高,其他数值请参考MSDN。

位图信息头的构造,代码如下:

得到位图数据的代码如下:

在这里主要运用GetDIBits来获得数据,存储在lpbitmap里面。至此,我们获得了所有的需要的数据:bmiHeader(文件头)、bmfHeader(位图信息头)、lpbitmap(位图数据)。

整合数据

我们先来谈谈保存至硬盘。由于需要写入文件元信息,我们需要用二进制的方式写文件,运用C++标准库,代码如下:

此时,就可以在项目目录里面获得一个存有当前屏幕快照的bmp文件了。

现在,我们发挥一下想象力,如果这段程序运行在别人的电脑上,通过这段程序,我们获得了他or她的屏幕快照,为了避免被发现这些操作,我们不能保存这些数据在硬盘上,直接将这些数据传到我们这……。我们可以整合这些数据,将它们存放在任何我们想要存放的地方:DB,服务器,硬盘等等。我们将所有的数据整合成一个二进制数据块:

现在,所有的信息都放在allData里面了, 我们可以写入文件:

可以通过socket传送到网络的另一端,然后再保存,也可以直接存入数据库。whatever u want!

总结

C++在底层用起来非常方便,可以随意转换数据,只要我们确定数据的结构及其大小即可。代码我就不上传了,非常短,别忘了释放new出的内存以及创造的兼容HDC等资源哦。

C++运用SDK截屏的更多相关文章

  1. Android手机截屏

    刚开始打算做一个简单的截屏程序时,以为很轻松就能搞定. 在Activity上放一个按钮,点击完成截屏操作,并将数据以图片形式保存在手机中. 动手之前,自然是看书和网上各种查资料.结果发现了解的知识越多 ...

  2. Android开发笔记:安卓程序截屏方法

    1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...

  3. iOS中正确的截屏姿势

    昨天写了个用到截屏功能的插件,结果问题不断,今天终于解决好了,把debug过程中所有尝试过的截屏方法都贴出来吧- 第一种 这是iOS 3时代开始就被使用的方法,它被废止于iOS 7.iOS的私有方法, ...

  4. adb获得安卓系统版本及截屏

    [时间:2017-09] [状态:Open] [关键词:adb, android,系统版本,截屏,screencap] 本文主要是我遇到的android命令行用法的一个简单总结 系统版本 获取系统版本 ...

  5. Android 截屏与 WebView 长图分享经验总结

    最近在做新业务需求的同时,我们在 Android 上遇到了一些之前没有碰到过的问题,截屏分享. WebView 生成长图以及长图在各个分享渠道分享时图片模糊甚至分享失败等问题,在这过程中踩了很多坑,到 ...

  6. android4.3 截屏功能的尝试与失败分析

    1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/199 ...

  7. iOS 百度地图截屏

    关于百度地图截屏的问题,发现不能用常用的方法进行载屏,常用的截屏方法所得到的图片地图瓦片底图会显示空白,网上给出的答案是这样的 :因为百度地图不是用UIKit实现的,所以得不到截图! 不过通过Open ...

  8. Javascript网页截屏的方法

    最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...

  9. Web截屏插件

    官方网站:http://www.ncmem.com 官方博客:http://www.cnblogs.com/xproer 产品首页:http://www.ncmem.com/webplug/scppr ...

随机推荐

  1. UVA 1557 - Calendar Game(博弈dp)

    UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次能够走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每一个日期,假设下 ...

  2. Swift3.0语法变化

    写在前面 首先和大家分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcod ...

  3. iOS开发——UI篇OC篇&初始化图片方式

    初始化图片方式 一.读取图片 1.从资源(resource)读取 [cpp] view plaincopyprint?   UIImage* image=[UIImage imageNamed:@&q ...

  4. android150 笔记

    1. 什么是Activity? 四大组件之一,一般的,一个用户交互界面对应一个activity,界面的容器. setContentView() ,// 要显示的布局 button.setOnclick ...

  5. 细看InnoDB数据落盘 图解 MYSQL 专家hatemysql

    http://hatemysql.com/?p=503 1.  概述 前面很多大侠都分享过MySQL的InnoDB存储引擎将数据刷新的各种情况.我们这篇文章从InnoDB往下,看看数据从InnoDB的 ...

  6. Python学习 之 数据类型(邹琪鲜 milo)

    1.Python中的数据类型:数字.字符串.列表.元组.字典 2.数字类型包括整型.长整型.浮点型.复数型 type(number):获取number的数据类型 整型(int):范围:-2,147,4 ...

  7. CentOS中查看系统资源占用情况的命令

    用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况 ...

  8. 小白日记16:kali渗透测试之弱点扫描-openvas、nessus

    漏洞扫描工具 1.openvas OpenVAS是开放式漏洞评估系统,也可以说它是一个包含着相关工具的网络扫描器.在kali上默认集成openvas.在kali上,配置相对简单[几乎每天都在更新] 实 ...

  9. 炼数成金hadoop视频干货02

    视频地址:http://pan.baidu.com/s/1dDEgKwD 这个视频理论性太强,不过倒是给了自己唯一的选项就是自己实践,不用像以前那样视频中敲一个字符,我也敲一个字符 讲到的内容: 介绍 ...

  10. HTTP 缓存策略

    浏览器一般缓存图片.CSS.JS等静态文件,因为这些文件的更新频率相对来说比较低,合理利用浏览器的缓存对网站的性能提升有很大帮助.HTTP缓存分为两部分,分别是本地缓存和缓存协商,当本地缓存不生效时会 ...