本文主要介绍如何截取电脑桌面并将其保存为bmp图片。

1. Bmp图像文件组成

  Bmp是Windows操作系统中的标准图像文件格式。

  Bmp图像文件由四部分组成:

  (1)位图头文件数据结构,包含Bmp图像文件的类型、文件大小等信息。

  (2)位图信息数据结构,包含Bmp图像的宽、高、压缩类型等信息。

  (3)颜色表,该部分可选,有些位图需要,有些位图(如24位真彩色位图)不需要。

  (4)位图数据。

1.1位图头文件数据结构

  位图头文件数据结构包含Bmp图像文件的类型、文件大小等信息,占用14个字节。其结构定义如下:

  1. typedef struct tagBITMAPFILEHEADER {
  2. WORD bfType;   //位图类型(必须为BM)
  3. DWORD bfSize;   //位图大小
  4. WORD bfReserved1;   //位图保留字
  5. WORD bfReserved2; //位图保留字
  6. DWORD bfOffBits; //位图数据的起始位置
  7. } BITMAPFILEHEADER;

  其中,bfType表明了位图类型,必须为BM;bfReserved1和bfReserved2是位图保留字,必须为0;bfOffBits表示了文件头的偏移量,也即位图数据的起始位置。

1.2位图信息数据结构

  位图信息数据结构用于说明位图的尺寸等信息,占用40个字节。其结构定义如下:

  1. typedef struct tagBITMAPINFOHEADER{
  2. DWORD biSize;   //本结构体所占用字节数
  3. LONG biWidth; //位图宽度
  4. LONG biHeight;    //位图高度
  5. WORD biPlanes;    //位图调色板数量
  6. WORD biBitCount; //每个像素所需的位数
  7. DWORD biCompression; //位图压缩类型(0不压缩)
  8. DWORD biSizeImage;    //位图大小
  9. LONG biXPelsPerMeter; //位图水平分辨率
  10. LONG biYPelsPerMeter; //位图垂直分辨率
  11. DWORD biClrUsed; //位图实际使用的颜色表中的颜色数
  12. DWORD biClrImportant; //位图显示过程中重要的颜色数
  13. } 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结构体定义如下:

  1. typedef struct tagRGBQUAD {
  2. BYTE rgbBlue; //蓝色
  3. BYTE rgbGreen; //绿色
  4. BYTE rgbRed; //红色
  5. BYTE rgbReserved; //保留值
  6. } 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图片。

  1. /*
  2. * 函数功能 : 该函数用于截取电脑桌面并将其保存为bmp图片
  3. * 备 注 :
  4. * 作 者 : 博客园 依旧淡然
  5. */
  6. void CCopyScreenDlg:: CopyScreenToBitmap ()
  7. {
  8. //创建桌面设备环境对象
  9. CDC screenDC;
  10. screenDC.CreateDC("DISPLAY", NULL, NULL, NULL);
  11.  
  12. //创建桌面位图对象
  13. CBitmap bmp;
  14. int nWidth = GetSystemMetrics(SM_CXSCREEN); //桌面宽度
  15. int nHeight = GetSystemMetrics(SM_CYSCREEN);   //桌面高度
  16. bmp.CreateCompatibleBitmap(&screenDC, nWidth, nHeight);
  17.  
  18. //创建内存设备环境对象
  19. CDC memDC;
  20. memDC.CreateCompatibleDC(&screenDC);
  21. memDC.SelectObject(&bmp);
  22. memDC.BitBlt(, , nWidth, nHeight, &screenDC, , , SRCCOPY);
  23.  
  24. //填充位图数据
  25. BITMAP bm;
  26. bmp.GetBitmap(&bm);
  27. DWORD bmSize = bm.bmWidthBytes*bm.bmHeight; //位图数据大小
  28. LPSTR bmData = (LPSTR)GlobalAlloc(GPTR, bmSize);   //位图数据
  29.  
  30. //填充位图头文件数据结构体
  31. BITMAPFILEHEADER hdr;
  32. hdr.bfType = (WORD)('M'<<)|'B';   //位图类型(必须为BM)
  33. hdr.bfSize = +bmSize; //位图大小
  34. hdr.bfReserved1 = ;   //位图保留字
  35. hdr.bfReserved2 = ;   //位图保留字
  36. hdr.bfOffBits = ; //位图数据的起始位置
  37.  
  38. //填充位图信息数据结构体
  39. BITMAPINFOHEADER bmpInfoHdr;
  40. bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); //本结构体所占用字节数
  41. bmpInfoHdr.biWidth = bm.bmWidth; //位图宽度
  42. bmpInfoHdr.biHeight = bm.bmHeight; //位图高度
  43. bmpInfoHdr.biPlanes = bm.bmPlanes; //位图调色板数量
  44. bmpInfoHdr.biBitCount = bm.bmBitsPixel; //每个像素所需的位数
  45. bmpInfoHdr.biCompression = ; //位图压缩类型(0不压缩)
  46. bmpInfoHdr.biSizeImage = bmSize; //位图大小
  47. bmpInfoHdr.biXPelsPerMeter = ; //位图水平分辨率
  48. bmpInfoHdr.biYPelsPerMeter = ; //位图垂直分辨率
  49. bmpInfoHdr.biClrUsed = ; //位图实际使用的颜色表中的颜色数
  50. bmpInfoHdr.biClrImportant = ; //位图显示过程中重要的颜色数
  51.  
  52. //指定颜色表由RGB三个直接值构成
  53. GetDIBits(screenDC, bmp, , bmpInfoHdr.biHeight, bmData, (BITMAPINFO*)&bmpInfoHdr, DIB_RGB_COLORS);
  54.  
  55. //保存bmp图片
  56. CFile file;
  57. if(file.Open("temp.bmp", CFile::modeCreate|CFile::modeWrite))
  58. {
  59. file.WriteHuge(&hdr, sizeof(BITMAPFILEHEADER)); //写入位图头文件数据
  60. file.WriteHuge(&bmpInfoHdr, sizeof(BITMAPINFOHEADER)); //写入位图信息数据
  61. file.WriteHuge(bmData, bmSize); //写入位图数据
  62. file.Close();
  63. }
  64. }

【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片的更多相关文章

  1. 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读

    本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...

  2. 【VC++技术杂谈003】打印技术之打印机状态监控

    在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...

  3. 【VC++技术杂谈008】使用zlib解压zip压缩文件

    最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...

  4. 【VC++技术杂谈007】使用GDI+进行图片格式转换

    本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...

  5. 【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信

    在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB.LAN.USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量.数据采集.数据分析和数据处理等操作.本文主要介绍 ...

  6. 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: B ...

  7. 【VC++技术杂谈001】音频技术之调节音量及设置静音

    本文主要介绍如何使用混音器Mixer API函数实现系统音量调节,以及设置静音. 1.混音器的作用及结构 1.1混音器的作用 声卡(音频卡)是计算机进行声音处理的适配器,具有三个基本功能: (1)音乐 ...

  8. WPF技术触屏上的应用系列(一): 3D 图片(照片)墙、柱面墙(凹面墙或者叫远景墙、凸面墙或者叫近景墙)实现

    原文:WPF技术触屏上的应用系列(一): 3D 图片(照片)墙.柱面墙(凹面墙或者叫远景墙.凸面墙或者叫近景墙)实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...

  9. VC++使用CImage在内存中Jpeg转换Bmp图片

    VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...

随机推荐

  1. LINUX 根目录说明

    linux目录:/bin      bin是Binary的缩写.这个目录存放着最经常使用的命令./boot 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件./data / ...

  2. 我理想中的父母(The Ideal Parents In My Heart)

    Parents are the first teachers in children's life, and people all know the great importance exactly ...

  3. wpf 仿QQ图片查看器

    参考博客 WPF下的仿QQ图片查看器 wpf图片查看器,支持鼠标滚动缩放拖拽 实现效果 主要参考的WPF下的仿QQ图片查看器,原博主只给出了部分代码. 没有完成的部分 1.右下角缩略图是原图不是缩略图 ...

  4. LeetCode 412. Fizz Buzz

    Problem: Write a program that outputs the string representation of numbers from 1 to n. But for mult ...

  5. 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 ...

  6. 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 ...

  7. 统计学习方法 --- 感知机模型原理及c++实现

    参考博客 Liam Q博客 和李航的<统计学习方法> 感知机学习旨在求出将训练数据集进行线性划分的分类超平面,为此,导入了基于误分类的损失函数,然后利用梯度下降法对损失函数进行极小化,从而 ...

  8. Apache多站点配置及启动失败解决办法

    一. Apache多站点配置方法 1.打开Apache安装目录下conf/httpd.conf文件,找到下面两行文字,把最前面的 # 号去掉,然后保存. #LoadModule vhost_alias ...

  9. js中函数的一些理论知识

      函数的一些理论知识 1. 函数:                执行一个明确的动作并提供一个返回值的独立代码块.同时函数也是javascript中的一级公民(就是函数和其它变量一样). 2.函数的 ...

  10. jsp和mysql乱码

    jsp页面,mysql页面上的中文不显示为乱码,各个地方使用的编码(如UTF-8,GB18030,GBK等)的编码保持一致即可. 1. jsp页面的编码: <%@page language=&q ...