Visual C++ 2019中MFC图像处理编程(一) 位图文件的介绍

Visual C++ 2019 中 MFC 图像处理编程(一)

1.1 位图文件及其C++操作

Windows操作系统中使用最多的图形文件格式就是位图格式,最常见的位图文件的扩展名为BMP。BMP是英文Bitmap(位图)的简写,这种格式的特点是包含的图像信息丰富,几乎不进行压缩,因此它占用的磁盘空间较大。下面主要介绍使用Visual C++对BMP文件的操作。

1.1.1 设备无关位图
Windows3.0以后的BMP位图文件格式斗鱼显示设备无关,因此把这种BMP位图文件称为设备无关图(device independent bitmap,DIB)。DIB自带颜色信息,因此调色板管理非常简单。

1.1.2 BMP图像文件数据结构
典型的BMP图像文件由以下4个部分组成,如下图所示。

在这里插入图片描述

  1. 位图文件头数据结构BITMAPFILEHEADER,包含BMP图像文件的类型、显示内容等信息。
  2. 位图信息头数据结构BITMAPINFOHEADER,包含由BMP图像的宽、高、压缩方法以及定义颜色等信息。
  3. 调色板,即颜色索引表。
  4. 实际的位图数据。

下面分别介绍BMP图像文件的这4个部分。

  1. 位图文件头BITMAPFILEHEADER结构
    位图文件头BITMAPFILEHEADER的定义可以在MFC Library中找到,这部分文件头包含了位图文件的类型、大小以及设备无关位图的图像文件布局。BITMAPFILEHEADER结构体长度固定,其定义和描述如下:
typedef struct tagBITMAPFILEHEADER {
	WORD    bfType;    //指定文件类型,必须是“BM”(0X4D42)
	DWORD   bfSize;    //指定位图文件的大小,以字节表示
	WORD    bfReserved1;  //保留字,必须为0
	WORD    bfReserved2;  //保留字,必须为0
	DWORD   bfOffBits;    //指定从实际图像数据到文件头起始的偏移量,以字节为单位
} BITMAPFILEHEADER, *PBITMAPFILEHEADER
  1. 位图信息头BITMAPINFOHEADER结构
    BITMAPINFOHEADER结构体中包含了设备无关位图关于颜色维度和色彩格式的信息,其定义和描述如下:
typedef struct tagBITMAPINFOHEADER{
	DWORD      biSize;  //本结构体占用的大小,单位为字节
	LONG        biWidth;   //位图图像的宽度,单位为像素
	LONG        biHeight;  //位图图像的高度,单位为像素
	WORD       biPlanes;   //设备上颜色平面数目,必须为1
	WORD       biBitCount;  //存储每个像素所使用的二进制位数
	DWORD      biCompression;   //是否压缩存储图像数据
	DWORD      biSizeImage;     //指定图像的大小(以字节为单位)
	LONG        biXPelsPerMeter;  //图像的水平分辨率,单位是像素每米
	LONG        biYPelsPerMeter;  //图像的垂直分辨率,单位是像素每米
	DWORD      biClrUsed;      //图像中实际使用了颜色索引表中的多少种颜色
	DWORD      biClrImportant;    //图像中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的
} BITMAPINFOHEADER, *PBITMAPINFOHEADER

重要成员参数解释:

  1. biBitCount 指定存储每个像素使用的二进制数据位数,间接确定图像中可能存在的最大颜色数目。可取:1、4、8、16、24、32。biBitCount成员可用于确定位图图像中每个像素所占的数据长度(单位是位)和图像中所包含的最多颜色数目,这个成员的取值可以有6中,分别对应BMP图像允许的6中颜色模式。BMP文件的色深(即存储每个像素使用的位数)有1(单色)、4(16色)、8(256色)、16(64K色,高彩色)、24(16M色,真彩色)、32(4096M色,增强型真彩色)6种。它们与biBitCount之间的对应关系如下:
    (1) biBitCount=1,位图图像为单色,并且成员bmiColors索引表包含两个条目。位图图像数组种每一个数据位代表一个像素。如果这个数据位是0,则此像素在显示时使用bmiColors索引表中的第一种颜色;如果这个数据位是1,则此像素在显示时使用bmiColors索引表中的第二种颜色。
    (2) biBitCount=4,位图图像最多包含16种颜色,并且成员bmiColors索引表中至多包含16个条目。此时位图图像数据区中的每一个像素条目长度是4位(0.5字节)。例如,如果位图图像数据区的第一个字节数值是0x1F,则这一字节表示2个像素的颜色,第一个像素是在索引表中的第二种颜色,第二个像素是在索引表中的第16种颜色。
    (3) biBitCount=8,位图图像最多包含256种颜色,并且成员bmiColors索引表中至多包含256个条目。在这种情况下,位图图像数据区中的每个字节代表一个像素的图像数据。
    (4) biBitCount=16,位图图像最多包含216种颜色,并且 BITMAPINFOHEADER 的biCompression成员取值必须为BI_BITFIELDS。此时bmiColors成员包含3个DWORD类型的颜色掩码,分别用以指定每个像素的红、绿、蓝是颜色成分。
    (5) biBitCount=24,位图图像最多包含224种颜色,并且成员bmiColors索引表为空(NULL)。在位图图像数据区中的每个三比特组中的数据表示某个像素中红、绿、蓝颜色成分的相对强度。
    (6) biBitCount=32,位图图像最多包含232种颜色,BITMAPINFOHEADER的biCompression成员必须是BI_BITFIELDS,bmiColors成员包含3个DWORD类型的颜色掩码,分别用以指定每个像素的红、绿、蓝是颜色成分。
  2. biSizeImage 指定图像的大小(以字节为单位)。biSizeImage=biWidth‘×biHeight。其中,biWidth’是图像每行占用的字节数,与实际宽度biWidth不同,biWidth’必须是4的整数倍,即大于或等于biWidth,最接近4的整数倍。例如,biWidth=400,则biWidth’=400;如果biWidth=401,则biWidth’=404。如果biCompression为BI_RGB,该项可能为零。
  3. biClrUsed成员指定位图图像中实际使用的颜色数目。如果biClrUsed成员被设置为零,则图像中实际使用的颜色数目是和biBitCount成员中规定的值相同的最大数目。

接下来介绍调色板结构。

  1. 调色板结构
    有些位图如索引图像需要调色板(Palette),有些像真彩色图则不需要,它们的BITMAPINFOHEADER后面直接是位图数据。
    调色板实际上是一个RGBQUAD型的数组,该数组总共有biClrUsed个元素(如果biClrUsed等于0,则有2biBitCount个元素。)RGBQUAD是一个用于存储RGB颜色数据的4个字节的结构体,其定义为:
typedef struct tagRGBQUAD {
	BYTE    rgbBlue;  //该颜色的蓝色分量
	BYTE    rgbGreen;  //该颜色的绿色分量
	BYTE    rgbRed;    //该颜色的红色分量
	BYTE    rgbReserved;  //保留值
} RGBQUAD
  1. 实际位图数据
    实际位图数据是一片连续的存储区域,其中保存着图像中每个像素的灰度(颜色)信息。对于256色灰度图像,图像数据就是该像素的实际灰度,1个像素需要1个字节来表示;对于索引图像,图像数据就是该像素颜色在调色板中的索引值;而对于真彩色图,图像数据就是实际的RGB值,1个像素需要3个字节来表示。

Tips:一般来说,BMP文件中实际位图数据的读取顺序是从下到上、从左到右。位图数据每一行占的字节数必须是4的整数倍,如果不是,则需要补齐。

综上所述:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值