为了有效地进行图像信息的传输或储存,减少描述图像的数据量是一件非常重要的工作。在Windows系统中,我们常见的bmp图片文件(bitmap file)是位图图片。位图图片的文件大小一般都是最大的,不便于存储和传输,所以后来才出现了一些"压缩"格式图片,如:gif、tiff、jpeg、png等图片文件。
图片"压缩"分为"有损压缩"(如jpeg图片)和"无损压缩":(如tiff图片)
什么是位图"para" label-module="para">
BMCP 采用无损压缩方法对图片进行压缩的,其处理流程大概如下:对一幅位图的所有象素点进行扫描,取出所有像素点的颜色构造颜色表,并且记录这些像素点的颜色在颜色表中的索引位置,然后再对这些索引位置记录进行压缩后再存储数据,也就是存储的时候像素点位置只存储索引而不存储颜色。我们都知道一张图按行列扫描时某个点的颜色在它后面连续同时出现的机率是很大的,所以我们的压缩就在这里了。简单的压缩原理用伪代码表示如下:
color = 图片的第一点像素点颜色;
while(图片的像素点没有扫描完)
newColor = 获取当前像素点的颜色;
if(newColor == color)
{
color的出现次数 1;
}else{
存储color;
color = newColor;
}
}
这样压缩后,我们就可以将一些连续出现的颜色点压缩为一个颜色点了。例如有下面的字符数据:
abceefaccccch
经我们压缩后就可以变为如下数据了:
a1b1c1e2f1a1c5h1
(注:字符后面的数字表示其连续出现的次数)
l BMCP 的颜色索引值的存储
我们大家都知道在bmcp里是存储颜色索引值的,而大家也知道在C#里的int/uint是占用4个字节空间的,所以我们存储象素颜色索引时肯定尽量避免存储为int/uint值!
在bmcp里颜色索引值的存储大小是根据颜色表的数量来决定的。当颜色表的颜色数量小于255个时索引占用的空间就只占用1个字节;而颜色表的数量小于ushort值范围时索引占用的空间就是2个字节;而如果颜色表数量小于ushort. MaxValue*255时就索引就占用3个字节(前2个字节存储的是“值/255”的整数部分,而后1个字节则存储的是“值%5”);否则就只能使用4个字节存储索引。
在上面的压缩计算中,我们还要存储一个“颜色连续出现的次数”值,这个值的大小在bmcp里是占用1个字节的,也就是说计算某颜色重复出现的次数时值最多只能记录到255次,如果还继续出现同一个颜色,则重新记录颜色!为什么要这样做呢?这是为了减少占用空间所做的,在很多图片中,不连续出现相同颜色的位置所占的比率也是很大的,而连续出现同一种颜色超出255次的地方则是少之又少。
l BMCP 的文件格式
BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间较大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。典型的BMP图像文件由三部分组成:位图文件头结构(BITMAPFILEHEADER),它包含BMP图像文件的类型、显示内容等信息;位图信息头结构(BITMAPINFOHEADER),它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;位图调色板。
l 位图文件头结构
BITMAPFILEHEADER中,bfTabe是标识数据,内容为固定值“BM”,用于标识文件格式为BMP文件。
bfSize的数据地址为2,数据类型为unsigned long,表示位图文件的大小。
bfReserved1和bfReserved2的数据地址分别为6和8,数据类型为unsigned int,是BMP文件的保留字,其值为0,暂无意义。
bfOffBits的数据地址为10,数据类型为unsigned long,以字节为单位,指示图像数据在文件内的起始地址,即图像距文件头的偏移量。
l 位图信息头结构
BITMAPINFOHEADER中,biSize的数据地址为14,数据类型为unsigned long,以字节为单位,指定数据结构BITMAPINFOHEADER所占用的存储容量,固定值为40。
biWidth和biHeigth的数据地址分别为18和22,数据类型为unsigned long,均以像素为单位,给出该BMP文件所描述位图的宽度和高度。若biHeigth取值为正数,则表明位图为bottom_up类型的DIB位图,位图的原点为左下角。若biHeigth取值为负数,则表明位图为top_down类型的DIB位图,位图的原点为左上角。一般情况下,取值为正数。
biPlanes数据地址为26,数据类型为unsigned int,表示目标设备平面数,必须置为1.
biBitCount的数据地址为28,数据类型为unsigned int,确定每个像素所需要的位数,即量化级数。
biCompression的数据地址为30,数据类型为unsigned long,表示bottom_up类型位图的压缩类型。值得注意的是,BMP文件格式对索引色图像及真彩色图像不做任何数据压缩。biSizeImage的数据地址为34,数据类型为unsigned long,以字节为单位,表示图像数据占用的空间大小。
biXperlsPerMeter和biYperlsPerMeter的数据地址为38和42,数据类型为unsignedlong,以每米像素数为单位,给出位图目标设备水平垂直的分辨率。
biClrUsed的数据地址是46,数据类型为unsigned long,给出位图实际使用的颜色表中的颜色变址数。
biClrImperant的数据地址为50,数据类型为unsigned long,给出位图显示过程中重要颜色的变址数。若取值为0,表示所有使用的颜色都是重要颜色。
l 位图调色板
RGBQUAD结构体由4个字节型数据组成,因此一个RGBQUAD结构体只占用4字节空间,从左到右每个字节依次表示(蓝色,绿色,红色,保留字)。
我们很清晰的了解到BMCP是如何做到压缩位图文件的。
1) 只存储每个象素点颜色索引值
2) 将连续出现相同颜色的多个象素点压缩为一个“象素点”