【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
本文主要介绍如何截取电脑桌面并将其保存为bmp图片。
1. Bmp图像文件组成
Bmp是Windows操作系统中的标准图像文件格式。
Bmp图像文件由四部分组成:
(1)位图头文件数据结构,包含Bmp图像文件的类型、文件大小等信息。
(2)位图信息数据结构,包含Bmp图像的宽、高、压缩类型等信息。
(3)颜色表,该部分可选,有些位图需要,有些位图(如24位真彩色位图)不需要。
(4)位图数据。
1.1位图头文件数据结构
位图头文件数据结构包含Bmp图像文件的类型、文件大小等信息,占用14个字节。其结构定义如下:
- typedef struct tagBITMAPFILEHEADER {
- WORD bfType; //位图类型(必须为BM)
- DWORD bfSize; //位图大小
- WORD bfReserved1; //位图保留字
- WORD bfReserved2; //位图保留字
- DWORD bfOffBits; //位图数据的起始位置
- } BITMAPFILEHEADER;
其中,bfType表明了位图类型,必须为BM;bfReserved1和bfReserved2是位图保留字,必须为0;bfOffBits表示了文件头的偏移量,也即位图数据的起始位置。
1.2位图信息数据结构
位图信息数据结构用于说明位图的尺寸等信息,占用40个字节。其结构定义如下:
- typedef struct tagBITMAPINFOHEADER{
- DWORD biSize; //本结构体所占用字节数
- LONG biWidth; //位图宽度
- LONG biHeight; //位图高度
- WORD biPlanes; //位图调色板数量
- WORD biBitCount; //每个像素所需的位数
- DWORD biCompression; //位图压缩类型(0不压缩)
- DWORD biSizeImage; //位图大小
- LONG biXPelsPerMeter; //位图水平分辨率
- LONG biYPelsPerMeter; //位图垂直分辨率
- DWORD biClrUsed; //位图实际使用的颜色表中的颜色数
- DWORD biClrImportant; //位图显示过程中重要的颜色数
- } BITMAPINFOHEADER;
其中,biWidth和biHeight分别表示位图的宽度和位图的高度,均匀像素为单位;biPlanes表示调色板的数量,必须为1;biBitCount表示每个像素所需的位数,其值必须是1(双色)、4(16色)、8(256色)、16(高彩色)或24(真彩色);biCompression表示位图压缩类型,其值必须是0(不压缩)、1(BI_RLE8压缩)或2(BI_RLE4压缩)。
1.3颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构体,定义一种颜色。RGBQUAD结构体定义如下:
- typedef struct tagRGBQUAD {
- BYTE rgbBlue; //蓝色
- BYTE rgbGreen; //绿色
- BYTE rgbRed; //红色
- BYTE rgbReserved; //保留值
- } RGBQUAD;
颜色表中RGBQUAD结构数据的个数由biBitCount来确定,当biBitCount为1,4,8时,分别有2,16,256个表项,当biBitCount为24,没有颜色表项。
1.4位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内从左到右,扫描行之间从下到上。当biBitCount为1时,8个像素占1个字节;当biBitCount为4时,2个像素占1个字节;当biBitCount为8时,1个像素占1个字节;当biBitCount为24时,1个像素占3个字节(顺序为B、G、R)。
2.编程示例
如下的代码示例了如何截取电脑桌面并将其保存为bmp图片。
- /*
- * 函数功能 : 该函数用于截取电脑桌面并将其保存为bmp图片
- * 备 注 :
- * 作 者 : 博客园 依旧淡然
- */
- void CCopyScreenDlg:: CopyScreenToBitmap ()
- {
- //创建桌面设备环境对象
- CDC screenDC;
- screenDC.CreateDC("DISPLAY", NULL, NULL, NULL);
- //创建桌面位图对象
- CBitmap bmp;
- int nWidth = GetSystemMetrics(SM_CXSCREEN); //桌面宽度
- int nHeight = GetSystemMetrics(SM_CYSCREEN); //桌面高度
- bmp.CreateCompatibleBitmap(&screenDC, nWidth, nHeight);
- //创建内存设备环境对象
- CDC memDC;
- memDC.CreateCompatibleDC(&screenDC);
- memDC.SelectObject(&bmp);
- memDC.BitBlt(, , nWidth, nHeight, &screenDC, , , SRCCOPY);
- //填充位图数据
- BITMAP bm;
- bmp.GetBitmap(&bm);
- DWORD bmSize = bm.bmWidthBytes*bm.bmHeight; //位图数据大小
- LPSTR bmData = (LPSTR)GlobalAlloc(GPTR, bmSize); //位图数据
- //填充位图头文件数据结构体
- BITMAPFILEHEADER hdr;
- hdr.bfType = (WORD)('M'<<)|'B'; //位图类型(必须为BM)
- hdr.bfSize = +bmSize; //位图大小
- hdr.bfReserved1 = ; //位图保留字
- hdr.bfReserved2 = ; //位图保留字
- hdr.bfOffBits = ; //位图数据的起始位置
- //填充位图信息数据结构体
- BITMAPINFOHEADER bmpInfoHdr;
- bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); //本结构体所占用字节数
- bmpInfoHdr.biWidth = bm.bmWidth; //位图宽度
- bmpInfoHdr.biHeight = bm.bmHeight; //位图高度
- bmpInfoHdr.biPlanes = bm.bmPlanes; //位图调色板数量
- bmpInfoHdr.biBitCount = bm.bmBitsPixel; //每个像素所需的位数
- bmpInfoHdr.biCompression = ; //位图压缩类型(0不压缩)
- bmpInfoHdr.biSizeImage = bmSize; //位图大小
- bmpInfoHdr.biXPelsPerMeter = ; //位图水平分辨率
- bmpInfoHdr.biYPelsPerMeter = ; //位图垂直分辨率
- bmpInfoHdr.biClrUsed = ; //位图实际使用的颜色表中的颜色数
- bmpInfoHdr.biClrImportant = ; //位图显示过程中重要的颜色数
- //指定颜色表由RGB三个直接值构成
- GetDIBits(screenDC, bmp, , bmpInfoHdr.biHeight, bmData, (BITMAPINFO*)&bmpInfoHdr, DIB_RGB_COLORS);
- //保存bmp图片
- CFile file;
- if(file.Open("temp.bmp", CFile::modeCreate|CFile::modeWrite))
- {
- file.WriteHuge(&hdr, sizeof(BITMAPFILEHEADER)); //写入位图头文件数据
- file.WriteHuge(&bmpInfoHdr, sizeof(BITMAPINFOHEADER)); //写入位图信息数据
- file.WriteHuge(bmData, bmSize); //写入位图数据
- file.Close();
- }
- }
【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片的更多相关文章
- 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...
- 【VC++技术杂谈003】打印技术之打印机状态监控
在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...
- 【VC++技术杂谈008】使用zlib解压zip压缩文件
最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...
- 【VC++技术杂谈007】使用GDI+进行图片格式转换
本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...
- 【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB.LAN.USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量.数据采集.数据分析和数据处理等操作.本文主要介绍 ...
- 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机
本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: B ...
- 【VC++技术杂谈001】音频技术之调节音量及设置静音
本文主要介绍如何使用混音器Mixer API函数实现系统音量调节,以及设置静音. 1.混音器的作用及结构 1.1混音器的作用 声卡(音频卡)是计算机进行声音处理的适配器,具有三个基本功能: (1)音乐 ...
- WPF技术触屏上的应用系列(一): 3D 图片(照片)墙、柱面墙(凹面墙或者叫远景墙、凸面墙或者叫近景墙)实现
原文:WPF技术触屏上的应用系列(一): 3D 图片(照片)墙.柱面墙(凹面墙或者叫远景墙.凸面墙或者叫近景墙)实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...
- VC++使用CImage在内存中Jpeg转换Bmp图片
VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...
随机推荐
- LINUX 根目录说明
linux目录:/bin bin是Binary的缩写.这个目录存放着最经常使用的命令./boot 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件./data / ...
- 我理想中的父母(The Ideal Parents In My Heart)
Parents are the first teachers in children's life, and people all know the great importance exactly ...
- wpf 仿QQ图片查看器
参考博客 WPF下的仿QQ图片查看器 wpf图片查看器,支持鼠标滚动缩放拖拽 实现效果 主要参考的WPF下的仿QQ图片查看器,原博主只给出了部分代码. 没有完成的部分 1.右下角缩略图是原图不是缩略图 ...
- LeetCode 412. Fizz Buzz
Problem: Write a program that outputs the string representation of numbers from 1 to n. But for mult ...
- Leetcode Delete Node in a Linked List
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...
- Leetcode Valid Anagram
Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...
- 统计学习方法 --- 感知机模型原理及c++实现
参考博客 Liam Q博客 和李航的<统计学习方法> 感知机学习旨在求出将训练数据集进行线性划分的分类超平面,为此,导入了基于误分类的损失函数,然后利用梯度下降法对损失函数进行极小化,从而 ...
- Apache多站点配置及启动失败解决办法
一. Apache多站点配置方法 1.打开Apache安装目录下conf/httpd.conf文件,找到下面两行文字,把最前面的 # 号去掉,然后保存. #LoadModule vhost_alias ...
- js中函数的一些理论知识
函数的一些理论知识 1. 函数: 执行一个明确的动作并提供一个返回值的独立代码块.同时函数也是javascript中的一级公民(就是函数和其它变量一样). 2.函数的 ...
- jsp和mysql乱码
jsp页面,mysql页面上的中文不显示为乱码,各个地方使用的编码(如UTF-8,GB18030,GBK等)的编码保持一致即可. 1. jsp页面的编码: <%@page language=&q ...