BMP图像格式

图象文件就是描绘了一幅图象的计算机磁盘文件。形成数字图象数据后,将其存储在计算机里的方法有2种,即位映射和向量处理方式。
  我们这里主要讨论的是位图。不同图象软件几乎都用各种的方法处理图象,图象格式也多种多样,它主要包括文件识别头和图象数据。文件识别头用来让计算机判断是哪种文件格式,图象数据包含了整个对图象描绘相关数据,包括调色板、位图映象等
一、常见图像格式
JPEG: (joint photographic experts group) 联合图像专家组开发,有损压缩的24位颜色图像格式.
TIFF: (tag image file format)标签图像文件格式,由aldus开发,支持多种子格式的统一图像格式,支持大小端格式和LZW压缩
GIF: (Graphics Interchange Format) 可交换图像格式,由compuserve开发,针对不超过256色的小图像设计,支持渐进显示和透明度.
PNG: (portable network graphics format) 可移植网络图像.没有专利算法,提供免费源代码.
BMP: 支持1,2,4,8位彩色索引图像和16,24,32位真彩图像.在4位和8位的彩色索引图像支持行程长度压缩.
二、常见图像压缩算法
1.行程长度压缩(Run Length Encoding)
原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。例如:aaabccccccddeee,则可用3a1b6c2d3e 来代替。对于拥有大面积,相同颜色区域的图像,用RLE压缩方法非常有效。由RLE原理派生出许多具体行程压缩方法:
  1).PCX行程压缩方法: 该算法实际上是位映射格式到压缩格式的转换算法,该算法对于连续出现1次的字节Ch,若Ch>0xc0则压缩时在该字节前加上0xc1,否则直接输出Ch,对于连续出现N 次的字节Ch,则压缩成0xc0+N,Ch这两个字节,因而N最大只能为ff-c0=3fh(十进制为63),当N大于63时, 则需分多次压缩。
  2).BI_RLE8压缩方法:在WINDOWS的位图文件中采用了这种压缩方法。该压缩方法编码也是以两个字节为基本单位。其中第一个字节规定了用第二个字节指定的颜色重复次数。 如编码 0504表示从当前位置开始连续显示5个颜色值为04的像素。当第一个字节为零时第二个字节有特殊含义:0表示行末;1表示图末;2转义后面2个字节,这两个字节分别表示下一像素相对于当前位置的水平位移和垂直位移。3-0xff表示后面紧跟几个单像素索引值,像素行程必须WORD对齐.
这种压缩方法所能压缩的图像像素位数最大为8位(256色)图像。
  3).BI_RLE压缩方法: 该方法也用于WINDOWS位图文件中,它与 BI_RLE8编码类似,唯一不同是:BI_RLE4的一个字节包含了两个像素的颜色,因此,它只能压缩的颜色数不超过16的图像。因而这种压缩应用范围有限。
  4).紧缩位压缩方法(Packbits):该方法是用于Apple公司的Macintosh机上的位图数据压缩 方,TIFF 规范中使用了这种方法.这种压缩方法与BI_RLE8压缩方法相似,如1c1c1c2132325648 压缩为:83 1c 21 81 32 56 48,显而易见,这种压缩方法最好情况是每连续128个字节相同,这128个字节可压缩为一个数值7f。这种方法还是非常有效的。
2.霍夫曼编码压缩:
也是一种常用的压缩方法。是1952年为文本文件建立的,其基本原理是频繁使用的数据用较短的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。如: 有一个原始数据序列,ABACCDAA则编码为A(0),B(10),C(110),(D111),压缩后为010011011011100。产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计出原始数据中的每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。
3.LZW压缩方法
LZW压缩技术比其它大多数压缩技术都复杂,压缩效率也较高。其基本原理是把每一个第一次出现的字符串用一个数值来编码,在还原程序中再将这个数值还成原来的字符串,如用数值0x100代替字符串abccddeee这样每当出现该字符串时,都用0x100代替,起到了压缩的作用。至于0x100与字符串的对应关系则是在压缩过程中动态生成的,而且这种对应关系是隐含在压缩数据中,随着解压缩的进行这张编码表会从压缩数据中逐步得到恢复,后面的压缩数据再根据前面数据产生的对应关系产生更多的对应关系。直到压缩文件结束为止。LZW是可逆的, 所有信息全部保留。
4.算术压缩方法
算术压缩与霍夫曼编码压缩方法类似,只不过它比霍夫曼编码更加有效。算术压缩适合于由相同的重复序列组成的文件,算术压缩接近压缩的理论极限。这种方法,是将不同的序列映像到0到1之间的区域内,该区域表示成可变精度(位数 )的二进制小数,越不常见的数据要的精度越高(更多的位数),这种方法比较复杂,因而不太常用。
5.JPEG( 联合摄影专家组 Joint Photographic Exprerts Group)
JPEG标准与其它的标准不同,它定义了不兼容的编码方法,在它最常用的模式中,它是带失真的,一个从JPEG文件恢复出来的图像与原始图像总是不同的,但有损压缩重建后的图像常常比原始图像的效果更好。JPEG的另一个显著的特点是它的压缩比例相当高,原图像大小与压缩后的图像大小相比,比例可以从 1%到80~90%不等。 这种方法效果也好,适合多媒体系统
三、BMP文件格式
位图分为DIB,DDB两种方式.
BMP位图采用小端模式存储数据, 一个典型的24位bmp文件的头信息:
在这里插入图片描述
位图文件总的分为3个部分:
1.文件信息结构,14个字节固定长度:
一个文件信息结构BITMAPFILEHEADER包含了位图文件的类型,大小等信息,告诉你这是一个位图文件,其中bfSize对于网络文件下载比较有用.
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //位图文件类型,对于windows位图必须是BM
DWORD bfSize; //位图文件的大小(bytes)
WORD bfReserved1; //保留,必须为0
WORD bfReserved2; //保留,必须为0
DWORD bfOffBits; //位图数据从文件开始的偏移(bytes)
} BITMAPFILEHEADER, *PBITMAPFILEHEADER
2.紧接着文件信息结构后面是一个位图信息结构(包含位图信息头和调试板),详细的描述了该位图的相关内容,包括位图大小,压缩方式,颜色表等.
其长度根据windows的不同版本是不一样的,具体的大小由该结构的开始4个字节指定,高版本的结构完全兼容低版本的结构,该结构仍然在不断的变化中:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //该结构的大小(bytes)
LONG biWidth; //位图的宽度(pixels),如果biCompression是JPEG,PNG表示解压后图像的宽度
LONG biHeight; //位图的高度(pixels),如果biCompression是JPEG,PNG表示解压后图像的高度
如果该值为正,表示位图的原点在左下角,显示行是自下而上;
如果该值为负,表示位图的原点在左上角,显示行是自上而下
WORD biPlanes; //目标设备的显示平面,必须为1
WORD biBitCount; //每个像素点的位数:0(JPEG,PNG),1,4,8,16,24,32
//上面的5个变量组成的一个最简单的头结构BITMAPCOREHEADER,最初是为OS/2设计的.
//从该结构扩展了下面的变量的结构是用得最多的.
DWORD biCompression; //压缩方法: BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS,BI_JPEG,BI_PNG.
//至下而上的图像才有压缩,自上而下的图像没有压缩.
DWORD biSizeImage; //图像的大小(bytes),压缩方法为BI_RGB时候,为0
LONG biXPelsPerMeter; //水平分辨率(pixels-per-meter)
LONG biYPelsPerMeter; //垂直分辨率(pixels-per-meter)
DWORD biClrUsed; //颜色表的项数
//1. biClrUsed非0,对于biBitCount小于16, 表示2^biBitCount项
//2. biClrUsed为0,也就是所有颜色被使用
DWORD biClrImportant; //指定显示位图需要的颜色索引数量,如果为0,表示全部颜色使用
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
在 Windows NT 4.0 and Windows 95定义了第4版的结构.该结构为了支持ICM1.0加入了RGBA颜色屏蔽,颜色空间,颜色结束点和灰度系数.
typedef struct {
DWORD bV4Size;
LONG bV4Width;
LONG bV4Height;
WORD bV4Planes;
WORD bV4BitCount;
DWORD bV4Compression;
DWORD bV4SizeImage;
LONG bV4XPelsPerMeter;
LONG bV4YPelsPerMeter;
DWORD bV4ClrUsed;
DWORD bV4ClrImportant;
DWORD bV4RedMask; //以下部分为新增部分.
DWORD bV4GreenMask;
DWORD bV4BlueMask;
DWORD bV4AlphaMask; //rgba的颜色屏蔽
DWORD bV4CSType; //DIB的颜色空间
CIEXYZTRIPLE bV4EndPoints; //颜色结束点
DWORD bV4GammaRed;
DWORD bV4GammaGreen;
DWORD bV4GammaBlue; //灰度系数(也称gamma值)
} BITMAPV4HEADER, *PBITMAPV4HEADER;
在Windows 2000 and Windows 98定义了第5版本的结构. 该结构为了支持ICM2.0加入了颜色空间类型,
渲染度和颜色说明数据.
typedef struct {
DWORD bV5Size;
LONG bV5Width;
LONG bV5Height;
WORD bV5Planes;
WORD bV5BitCount;
DWORD bV5Compression;
DWORD bV5SizeImage;
LONG bV5XPelsPerMeter;
LONG bV5YPelsPerMeter;
DWORD bV5ClrUsed;
DWORD bV5ClrImportant;
DWORD bV5RedMask;
DWORD bV5GreenMask;
DWORD bV5BlueMask;
DWORD bV5AlphaMask;
DWORD bV5CSType; //有新增类型PROFILE_LINKED等
CIEXYZTRIPLE bV5EndPoints;
DWORD bV5GammaRed;
DWORD bV5GammaGreen;
DWORD bV5GammaBlue;
DWORD bV5Intent; //位图的渲染度.
DWORD bV5ProfileData; //描述文件数据
DWORD bV5ProfileSize; //描述文件数据size
DWORD bV5Reserved;
} BITMAPV5HEADER, *PBITMAPV5HEADER;
3.图像数据部分
依照前面的数据结构,对每一个像素点进行解析就能完整重现原始数据。
原创文章,欢迎转载,请注明来源,未经书面允许,请勿用于商业用途。
关注微信公众号:嵌入式开发实战营,了解更多。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值