打印

【转】位图(bmp)文件格式分析

[复制链接]
1266|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
联通移不动|  楼主 | 2017-1-10 12:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

位图(bmp)文件格式分析

作者:深蓝(由博主分享)

一、什么是位图

计算机能以位图和矢量图格式显示图像。

1、位图(Bitmap):

图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述图像。计算机屏幕其实就是一张包含大量像素点的网格。当我们把位图放大时,每一个像素小点看上去就像是一个个马赛克色块。

2、矢量图(Vector)

使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。

位图和矢量图最简单的区别就是:矢量图可以无限放大,而且不会失真;而位图则不能。

像Photoshop(PS)这样主要用于处理位图的软件,我们称之为图像处理软件;专门处理矢量图的软件,我们称之为图形设计软件,例如Adobe Illustrator,CorelDRAW,Flash MX等。

二、BMP位图文件

常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。

BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以后的BMP文件都是指设备无关位图(DIB,device-independent bitmap)。BMP位图文件默认的文件扩展名是.BMP,有时它也会以.DIB或.RLE作扩展名。

注:本文采用lena.bmp(512×512)做例子:


1、BMP文件结构

BMP文件由4部分组成:

1.   位图文件头(bitmap-file header)

2.   位图信息头(bitmap-informationheader)

3.   颜色表(color table)

4.   颜色点阵数据(bits data)

24位真彩色位图没有颜色表,所以只有1、2、4这三部分。

用UltraEdit打开lena.bmp,可以看到这个文件的全部数据如下图所示:



1、1位图文件头

位图文件头分4部分,共14字节:

名称
占用空间
内容
实际数据

bfType
2字节
标识,就是“BM”二字
BM

bfSize
4字节
整个BMP文件的大小
0x000C0036(786486)

bfReserved1/2
4字节
保留字,没用
0

bfOffBits
4字节
偏移数,即 位图文件头+位图信息头+调色板 的大小
0x36(54)

注意,Windows的数据是倒着念的,这是PC电脑的特色。如果一段数据为50 1A 25 3C,倒着念就是3C 25 1A50,即0x3C251A50。因此,如果bfSize的数据为36 00 0C 00,实际上就成了0x000C0036,也就是0xC0036。


1、2位图信息头

位图信息头共40字节:

名称
占用空间
内容
实际数据

biSize
4字节
位图信息头的大小,为40
0x28(40)

biWidth
4字节
位图的宽度,单位是像素
0x200(512)

biHeight
4字节
位图的高度,单位是像素
0x200(512)

biPlanes
2字节
固定值1
1

biBitCount
2字节
每个像素的位数
1-黑白图,4-16色,8-256色,24-真彩色
0x18(24)

biCompression
4字节
压缩方式,BI_RGB(0)为不压缩
0

biSizeImage
4字节
位图全部像素占用的字节数,BI_RGB时可设为0
0x0C

biXPelsPerMeter
4字节
水平分辨率(像素/米)
0

biYPelsPerMeter
4字节
垂直分辨率(像素/米)
0

biClrUsed
4字节
位图使用的颜色数
如果为0,则颜色数为2的biBitCount次方
0

biClrImportant
4字节
重要的颜色数,0代表所有颜色都重要
0

作为真彩色位图,我们主要关心的是biWidth和biHeight这两个数值,两个数值告诉我们图像的尺寸。biSize,biPlanes,biBitCount这几个数值是固定的。想偷懒的话,其它的数值可以一律用0来填充。


1、3颜色表

24位真彩色位图没有颜色表。为了简化,只讨论24位真彩色位图。

1、4颜色点阵数据

位图全部的像素,是按照自下向上,自左向右的顺序排列的。

RGB数据也是倒着念的,原始数据是按B、G、R的顺序排列的。

三、Photoshop和Windows的BMP文件比较

Windows的BMP文件最后少了两个0字节,没有整体补位。bfSize(文件大小),biSizeImage(全部像素大小)也相应地减去2。


打开Photoshop,新建一个尺寸为2*3像素的文件:



放大图片到最大(1600%),然后用铅笔工具对每个像素都点一个不同颜色的点,如下图所示:



储存这个文件为BMP格式,文件名为“MyBmp.bmp”,在BMP选项中选择Windows,24位:




你应该注意到图中用黑色框起来的00 00了,在每行颜色的末尾添加的两个0字节,是为了行补位。为什么要行补位呢?因为32位的Windows操作系统处理4个字节(32位)的速度比较快,所以BMP的每一行颜色占用的字节数规定为4的整数倍。MyBmp.bmp中一行颜色有两个像素,共占用6字节,如果要补齐4*2=8字节,就要再加两个0字节。

行补位的公式为:widthBytes = (width*biBitCount+31)/32*4

参数说明:

Width:位图的实际宽度

biBitCount:每个像素的位数

1-黑白图,4-16色,8-256色,24-真彩色

注:Phtoshop在文件的末尾还补充了两个0字节,好像是要整体补位。不过我看过的BMP资料中都没有提到还要整体补位的,其它软件生成的BMP文件也没有整体补位的,这看起来像是Adobe的独创,不知道目的何在。


相关帖子

沙发
联通移不动|  楼主 | 2017-1-10 12:23 | 只看该作者
提出问题

上一篇**里在最后我说过:PS产生的位图(bmp)文件每个像素都是4字节,第四个字节是用来补位的,但是并没有解释这么做的原因。

我们先看一下windows产生的位图是什么样的。你会疑问:难道不是上一篇说的那样吗?

下面我给详细展示一下:

一、首先随便找两张图片

这里我用lena.bmp和hoses.bmp(万马奔腾的图像),这个位图是将jpg文件通过画图板转换得来的:

Lena图像略过,因为上一篇**里有她的相关信息。

Hoses.jpg:


Hoses.bmp:



这种通过转化得来的图片是按照windows格式排版生成的。



二、分析:1、首先从数学角度分析,提出位图大小计算公式:

用ultraedit打开lena.bmp和hoses.bmp文件,结果如下:

a)        :lena.bmp



仔细看下我标注的头信息,按照我上一篇**对它进行解析(用windows的程序员计算器计算,注意十六进制的顺序,不懂的看上一篇):

红色部分——位图大小:786186 bits(位)

橙色部分——宽度:512

蓝色部分——高度:512

由于windows产生的位图RGB依然是3个字节,并没有在像素内填充无效位,故位图的大小可以通过下面的公式计算:

Size=width*height*3+ 54     ①

其中width是位图宽度,height是位图高度,54是头部信息长度(0x36 == 54个字节)。

用这个公式计算lena.bmp大小:512*512*3 +54 = 786486。结果正确!Perfect!

b):一个例子并不能证明问题的普遍性,再看hoses.bmp:



红色部分——位图大小:392454 bits(位)

橙色部分——宽度:435

蓝色部分——高度:300

用上面的公式计算lena.bmp大小:435*300*3 +54 = 391554。可是它的实际大小是392454!说明我们的公式有问题,并不通用。

c):接下来我随便找了八张位图,分析了它们的头部信息(在excle中列出来):



注意看,他们的理论值和实际值都不相等!

我们再看“处理后信息”这一列:它们的差值和是高度的n倍,n和宽度有关。


分析n和宽度的关系:

我们考虑字节对齐,因为windows系统的文件普遍存在字节对齐(方便读写和查找)。



通过分析可以看出来:windows的位图也是4字节对齐的。

提出新的公式:

Size= (width*3 + width%4)*height + 54   ②

其中:%是取模运算,结果是width除4得到的余数。

通过新公式计算的到八张图片的大小——红色部分:



结果完全正确!Perfect!

注:注意看右上角的公式;当然这个过程提出过几次错误的公式,我就不赘述了。

2、分析公式得出结论

通过分析上面的公式②得出下面的结论:

理论一:windows的位图也是有字节对齐的,只是在每一行的最后补齐不足的字节数(n=width%4)

           注:Lena.bmp之所以第一次就通过,完全是一个巧合,①是②的一个特殊情况。

理论二:Photoshop位图每个像素4Bytes(字节),就是为了避免在每行的最后字节对齐

附hoses.bmp的字节对齐图片,注意文件结束时最后几个字节(文件中部的部分不容易分辨):


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

127

帖子

0

粉丝