• 位图分析续


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



  • 相关阅读:
    调用Mapreduce,org.apache.hadoop.hbase.mapreduce处理hbase问题
    mysql用视图和事件实现数据间隔插入数据到表
    mysql自定义函数实现数据正则处理
    ambari安装Zeppelin Notebook提示ES源找不到问题解决
    IDEA 进行编译代码的时候,报错误Error:scalac: IO error while decoding .* with GBK
    Linux最大线程数限制及当前线程数查询
    rhel log 日志时间戳时间不对更改方法
    usb禁用验证
    CentOS 7 下挂载NTFS文件系统并实行开机自动挂载
    linux 判定那块网卡为eth0 eth0对应的物理网卡闪灯30秒
  • 原文地址:https://www.cnblogs.com/qingchuwudi/p/12077742.html
Copyright © 2020-2023  润新知