位图分析续

1、  续上次:http://blog.csdn.net/qingchuwudi/article/details/25785307

提出问题

上一篇文章里在最后我说过: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的字节对齐图片,注意文件结束时最后几个字节(文件中部的部分不容易分辨):



posted @ 2019-12-21 18:01  qingchuwudi  阅读(301)  评论(0编辑  收藏  举报