• 位图(bmp)文件格式分析


    位图(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的独创,不知道目的何在。

    PS:文章最后注的内容将由下篇文章解释

  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/qingchuwudi/p/12077743.html
Copyright © 2020-2023  润新知