Windows中有与BitmapFileHeader、BitmapInfoHeader对应的同名结构,MSDN中有对这些结构的成员有详细介绍,在此不再详述,只介绍与本文内容密切相关的部分。
常用的BMP存储格式有真彩图和1、4、8位索引图,对应于BitmapInfoHeader结构中BiBitCount的数值分别是24、1、4、8,它表示保存一个像素所需要的比特数。真彩图用24位(3个字节)保存每个像素的颜色信息,其中各用8位代表红、绿、蓝(R、G、B)三种颜色分量,每种颜色分量可表示为255级,真彩图不需使用调色板。索引图是指将颜色信息做成索引,保存在调色板中。记录像素颜色信息只需保存相应的颜色索引,可以大大减少像素信息存储所占用的空间。调色板信息保存在BitmapInfoHeader后,调色板中每种颜色占用32位。1位索引图中保存每个像素的颜色索引使用1个比特,因此1位索引图只有2种颜色。同理,4、8位索引图分别使用16种和256种颜色。因此,BiBitCount实际上代表了BMP图像的类型。
在Dib Bit image中存放像素信息时,从图像的最下一行开始向上逐行存储,每一行像素所占用的字节数必须是4的倍数。如果所占用的字节数不满足4的倍数,需要在其后填充补足,一般在后面直接补0。
在做BMP图像切割、存储时,一般不需要改变图像的颜色格式,即真彩图依旧是真彩图,索引图仍然是索引图。
综合上面的BMP图像格式的相关知识,可以得出结论:在做BMP图像切割、存储时,新图像的BitmapFileHeader、BitmapInfoHeader部分只需将原图像相关部分拷贝过来做少量修改即可。需要做较多修改的是Dib bit Image部分。对索引图而言,每个像素保存的起始比特位置可能不是一个字节起始比特位,像素的终止比特位可能也不是一个字节的末比特位。因此在对Dib bit Image进行修改时,需要对字节的位进行修改。
CDib类实现了对BMP图像文件的读取和显示。以该类为基础,在该类的基础上扩展得到对BMP图像切割、存储的功能。
3 算法概述
切割图像的矩形用两个CPoint对象定义,分别代表举行左上角(m_LU)和右下角(m_RB)顶点位置。
|