精华内容
下载资源
问答
  • 简洁的BMP分析器

    2014-06-19 10:53:38
    简洁的BMP分析工具,适合查看BMP格式的各个参数
  • BMP文件格式的分析

    2020-02-16 19:22:17
    讲解BMP文件的结构

    一、BMP简介

    BMP文件格式,即Bitmap(位图),是Windows系统中使用最广泛的图像文件格式。由于它可以不作任何变换的保存图像的像素域的数据,因此成为我们去的RAW数据(RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据)的重要来源。Windows的图形用户界面也在它的内建图像子系统GDI(GDI是图形设备接口的英文缩写,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形和图像输出)中对BMP格式提供了支持。

    二、BMP文件的结构

    BMP文件的数据结构按按照文件头开始的先后顺序分为四个部分:

    • bmp文件头(bmp file header):提供文件的格式、大小等信息
    • 位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
    • 彩色表/调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应颜色的映射表
    • 位图数据(bitmpa data):即图形数据
    数据段名称对应的Windows结构体定义大小(Byte)
    bmp文件头BITMAPFILEHEADER14
    位图信息头BITMAPINFOHEADER40
    调色板由颜色索引数决定
    位图数据由图像尺寸决定

    1、bmp文件头

    结构体定义:

    typedef struct tagBITMAPFILEHEADER { 
    WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits; 
    } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
    

    各字段含义:

    字段名大小(单位:字节)描述
    bfType2位图类别,根据不同的操作系统而不同,在Windows中,此字段的值总为‘BM’
    bfSize4BMP图像文件的大小
    bfReserved12总为0
    bfReserved22总为0
    bfOffBits4BMP图像数据的地址

    2、位图信息头

    结构体定义:

    `typedef struct tagBITMAPINFOHEADER{ 
    DWORD      biSize; 
    LONG        biWidth; 
    LONG        biHeight; 
    WORD       biPlanes; 
    WORD       biBitCount; 
    DWORD      biCompression; 
    DWORD      biSizeImage; 
    LONG        biXPelsPerMeter; 
    LONG        biYPelsPerMeter; 
    DWORD      biClrUsed; 
    DWORD      biClrImportant; 
    } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;`
    

    各字段含义:

    字 段 名大小(单位:字节)描 述
    biSize4本结构的大小,根据不同的操作系统而不同,在Windows中,此字段的值总为28h字节=40字节
    biWidth4BMP图像的宽度,单位像素
    biHeight4总为0
    biPlanes2总为0
    biBitCount2BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色
    biCompression4压缩方式,0表示不压缩,1表示RLE8压缩,2表示RLE4压缩,3表示每个像素值由指定的掩码决定
    biSizeImage4BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足
    biXPelsPerMeter4水平分辨率,单位像素/m
    biYPelsPerMeter4垂直分辨率,单位像素/m
    biClrUsed4BMP图像使用的颜色,0表示使用全部颜色,对于256色位图来说,此值为100h=256
    biClrImportant4重要的颜色数,此值为0时所有颜色都重要,对于使用调色板的BMP图像来说,当显卡不能够显示所有颜色时,此值将辅助驱动程序显示颜色

    3、彩色版/调色板

    是单色、16色、256色图像文件所持有的,相对应的调色板大小时2、16、256,调色吧以4字节为单位,每4个字节存放一个颜色值,图像的数据是指向调色板的索引。
    可以将调色板想象成一个数组,每个数组元素的大小为4字节,假设有一个256色的BMP图像的调色板数据为:

    调色板[0]=黑、调色板[1]=百、调色板[2]=红...调色板[255]=黄
    

    图像数据01 00 02 FF表示调用调色板[1]、调色板[0]、调色板[2]和调色板[255]中的数据来显示图像颜色。
    在早期的计算机中,显卡相对比较落后,不一定能保证显示所有的颜色,所以在调色板中的颜色数据应尽可能的将图像中的主要颜色按照顺序排列在前面,位图信息头的biClrImportant字段指出了有多少种颜色是重要的。
    每个调色板的大小为4字节,按蓝、绿、红存储一个颜色值。
    结构体定义:

    typedef struct tagRGBQUAD { 
    BYTE    rgbBlue; 
    BYTE    rgbGreen; 
    BYTE    rgbRed; 
    BYTE    rgbReserved; 
    } RGBQUAD;
    

    各字段含义:

    字 段 名大小(单位:字节)描 述
    rgbBlue1蓝色值
    rgbGreen1绿色值
    rgbRed1红色值
    rgbReserved1保留,总为0

    4、位图数据

    如果图像是单色、16色、256色,则紧跟着调色板的是位图数据,位图数据是指向调色板的索引序号。

    如果位图是16位、24位、32位色,则图像文件中不保留调色板,即不存在调色板,图像的颜色直接在位图数据中给出。
    16位图像使用2字节保存颜色值,常见有两种格式:5位红5位绿5位蓝和5位红6位绿5位蓝,即555格式和565格式。其中555格式只使用了15位,最后一位保留,设为0。

    24位图像使用3字节保存颜色值,每一个字节表示一种颜色,按红、绿、蓝排列。

    32位图像使用4字节保存颜色值,每一个字节代表一种颜色,除了原来的红、绿、蓝,还有Alpha通道(透明色)。

    如果图形带有调色板,则位图数据可以根据需要选择压缩和不压缩,如果选择压缩,则根据BMP图像是16色或256色,采用RLE4或RLE8压缩算法压缩。

    RLE4是压缩16色图像数据的,其压缩方式如下:

    方案1字节2字节3字节4字节N字节
    A重复次数颜色索引
    B设为0后面有效的颜色索引数颜色索引颜色索引颜色索引

    如果有如下16色位图数据,共20字节,数据使用了RLE4压缩:

    05 00 04 05 00 08 09 05 04 00 04 05 08 09 04 08 07 01 00 00
    

    数据解压时首先读取05,因为05不等于0,所以选择A方案,根据A方案,05表示后面数据重复的次数,接着读取00,00表示有两个颜色索引,每 个索引占4位,第一个像素在高4位,第二个像素在低4位,即在一个字节中低像素在高位,高像素在低位。05 00解压后等于00 00 0。

    读取04,选择A方案,按照上面的操作解析,04是后面数据重复的次数,05是两个颜色索引,第3个颜色索引为5,第4个颜色索引为0。04 05解压后等于05 05。

    读取00,选择B方案,读取08,08表示后面有效的颜色索引数。00 08解压后等于09 05 04 00。

    读取04,选择A方案,按照上面的操作解析,04是后面数据重复的次数,05是两个颜色索引。04 05解压后等于05 05。

    读取08,选择A方案,按照上面的操作解析,08是后面数据重复的次数,09是两个颜色索引。08 09解压后等于09 09 09 09。
    读 取04,选择A方案,按照上面的操作解析,04是后面数据重复的次数,08是两个颜色索引。04 08解压后等于08 08。

    读取07,选择A方案,按照上面的操作解析,07是后面数据重复的次数,01是两个颜色索引。07 01解压后等于01 01 01 0。

    读取00,选择B方案,读取00,00表示后面有效的颜色索引数,0表示无,即解压完一行数据。

    综合上面的操作,解压后的数据为:

    00 00 00 50 50 90 50 40 00 50 50 90 90 90 90 80 80 10 10 10
    

    看上去和原来的数据大小一样,没有体现到压缩效果,这是因为上面的例子只选择了20字节数据,而且这20字节数据中重复的数据不多,使用RLE压缩 重复数据不多的数据时,有时可能压缩后的大小反而比原来的数据还大。其实一般情况下当数据比较多而且重复的时候,使用RLE压缩效果还是比较理想的。
    RLE8的压缩方式可以参考上面的RLE4解压方法,惟一的区别是RLE8使用1个字节存放颜色索引,而RLE4使用4位存放颜色索引。

    三、BMP文件分析

    用winhex打开下面这张图片
    在这里插入图片描述

    1、bmp文件头

    在这里插入图片描述

    大小十六进制值描述
    242 4DBM的ASCII值,在Windows中的BMP文件的标识符
    446 02 03 0003 02 46H=197190,是图片文件的大小
    200 00保留值,总是0
    200 00保留值,总是0
    436 00 00 0036H=54,是图像数据的地址,即文件头+信息头+调色板的长度

    2、位图信息头

    在这里插入图片描述

    大小(单位:字节)数据描述
    428 00 00 00BMP图像的图位信息头大小
    428 01 00 0000 00 01 28H=296,是图形的宽度,单位像素
    4DE 00 00 0000 00 00 DE=222,是图像的高度,单位像素
    201 00总是1
    218 0000 18H=24,是图像的色深,即2的24次幂等于16,777,216
    400 00 00 00压缩方式,0表示不压缩
    410 02 03 0000 03 02 10H=197,136,是图像的图像大小,单位字节
    425 16 00 0000 00 16 25=5,669,是图像的水平分辨率,单位像素/m
    425 16 00 0000 00 16 25H=5,669,是图像的垂直分辨率,单位像素/m
    400 00 00 00图像的颜色数,0表示使用全部颜色
    400 00 00 00图像中重要的颜色数,0表示所有颜色都重要

    3、调色板

    根据BMP文件结构的定义,因为该图像是256色的位图,所有应该有256个调色板,每个调色板4个字节,共1024字节大小。如图所示:
    在这里插入图片描述

    图像的调色板从00000036H开始存储
    在这里插入图片描述
    图像的调色板到00000435H存储结束

    从图中可以看出00000435H-00000036H+1=1024

    4、位图数据

    (略)

    参考:https://www.baidu.com/link?url=CmW4JS6ZToaVsEc0LjEYacf2U3F0LMZpZvHuLgb0K5FWkiauYSvhyarfjJZvSAnstJHpCPnLWwWnF_jVd_cUN0LLp1UEwjM-xzj2SYCz5iG&wd=&eqid=8981a4ea0000004d000000025e44faa9

    展开全文
  • BMP文件格式分析

    2008-07-23 21:51:00
     BMP图像格式解析一,文件格式定义:BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。...

     这段时间研究些关于图形图像的东西,学习了下仔细的结构,这个是在网上看到的材料,尽做记录使用.

     

     

    BMP图像格式解析
    一,文件格式定义:
    BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
    文件
    文件可看成由4个部分成:位文件(bitmap-file header)、位信息(bitmap-information header)、彩色表(color table)和定的字节阵列,它具有如下所示的形式。
    文件的
    构名称
    符号
    文件(bitmap-file header)
    BITMAPFILEHEADER
    bmfh
    信息(bitmap-information header)
    BITMAPINFOHEADER
    bmih
    彩色表(color table)
    RGBQUAD
    aColors[]
    象数据列字
    BYTE
    aBitmapBits[]
    文件构可合在表6-01中。
    01 文件构内容摘要
     
    偏移量
    域的名称
    大小
    内容
     
     
     
    象文件
    0000h
    文件标识
    2 bytes
    两字的内容用来识别型:
    ‘BM’ : Windows 3.1x, 95, NT, …
    ‘BA’ :OS/2 Bitmap Array
    ‘CI’ :OS/2 Color Icon
    ‘CP’ :OS/2 Color Pointer
    ‘IC’ : OS/2 Icon
    ‘PT’ :OS/2 Pointer
    注:因OS/2并没有被普及,所以在,你只需判断第一个标识“BM”就行。
     
    0002h
    File Size
    1 dword
    用字表示的整个文件的大小
     
    0006h
    Reserved
    1 dword
    保留,必须设0
     
    000Ah
    Bitmap Data Offset
    1 dword
    从文件始到位数据始之的数据(bitmap data)的偏移量
     
    000Eh
    Bitmap Header Size
    1 dword
    信息(Bitmap Info Header)的度,用来描述位色、压缩方法等。下面的度表示:
    28h - Windows 3.1x, 95, NT, …
    0Ch - OS/2 1.x
    F0h - OS/2 2.x
    注:在Windows95982000等操作系中,位信息度并不一定是28h,因制定出了新的BMP文件格式,其中的信息头结化比大,度加。所以最好不要直接使用常数28h,而是应该从具体的文件中这样才能确保程序的兼容性。
     
    0012h
    Width
    1 dword
    度,以象素为单
     
    0016h
    Height
    1 dword
    的高度,以象素为单
     
    001Ah
    Planes
    1 word
    的位面数(注:该值1
    信息
     
     
    001Ch
    Bits Per Pixel
    1 word
    个象素的位数
    1 - 色位实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这种颜色)
    4 - 16 色位
    8 - 256 色位
    16 - 16bit 高彩色位
    24 - 24bit 真彩色位
    32 - 32bit 增型真彩色位
     
    001Eh
    Compression
    1 dword
    压缩说明:
    0 - 压缩 (使用BI_RGB表示)
    1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
    2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
    3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
     
    0022h
    Bitmap Data Size
    1 dword
    用字数表示的位数据的大小。数必是4的倍数
     
    0026h
    HResolution
    1 dword
    用象素/米表示的水平分辨率
     
    002Ah
    VResolution
    1 dword
    用象素/米表示的垂直分辨率
     
    002Eh
    Colors
    1 dword
    使用的色数。如8-比特/象素表示100h或者 256.
     
    0032h
    Important Colors
    1 dword
    指定重要的色数。当域的等于色数(或者等于0),表示所有色都一重要
    色板数据
    根据BMP版本的不同而不同
    Palette
    N * 4 byte
    色板范。色板中的个表4个字用下述方法来描述RGB
    • 1字用于色分量
    • 1字用于绿色分量
    • 1字用于色分量
    • 1用于填充符(0)
    象数据
    根据BMP版本及色板尺寸的不同而不同
    Bitmap Data
    xxx bytes
    域的大小取决于压缩方法及像的尺寸和像的位深度,它包含所有的位数据字些数据可能是彩色色板的索引号,也可能是实际RGB将根据像信息中的位深度来决定。
     
     
    构件
    1. 文件
    文件包含有于文件型、文件大小、存放位置等信息,在Windows 3.0以上版本的位文件中用BITMAPFILEHEADER构来定
    typedef struct tagBITMAPFILEHEADER { /* bmfh */
    UINT bfType;
    DWORD bfSize;
    UINT bfReserved1;
    UINT bfReserved2;
    DWORD bfOffBits;
    } BITMAPFILEHEADER;
    其中: 

    bfType
    明文件的.该值必需是0x4D42,也就是字符'BM'。我不需要判断OS/2的位图标识这么在来看似乎已没有什了,而且如果要支持OS/2的位,程序将得很繁所以,在此只建察'BM'标识) 
    bfSize
    明文件的大小,用字节为单
    bfReserved1
    保留,必须设0
    bfReserved2
    保留,必须设0
    bfOffBits
    明从文件头开始到实际象数据之的字的偏移量。个参数是非常有用的,因信息色板的度会根据不同情况而化,所以你可以用个偏移迅速的从文件中取到位数据。

    2. 位信息
    信息用BITMAPINFO构来定,它由位信息(bitmap-information header)和彩色表(color table)成,前者用BITMAPINFOHEADER构定,后者用RGBQUAD构定。BITMAPINFO构具有如下形式:
    typedef struct tagBITMAPINFO { /* bmi */
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD bmiColors[1];
    } BITMAPINFO;
     
    其中:
     

    bmiHeader
    明BITMAPINFOHEADER构,其中包含了有的尺寸及位格式等信息
    bmiColors
    明彩色表RGBQUAD构的列,其中包含索引像的真RGB

    BITMAPINFOHEADER构包含有位文件的大小、压缩类型和色格式,其构定义为
    typedef struct tagBITMAPINFOHEADER { /* bmih */
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
    } BITMAPINFOHEADER;
     
    其中:
     

    biSize
    明BITMAPINFOHEADER构所需要的字数。注:并不一定是BITMAPINFOHEADER构的尺寸,它也可能是sizeof(BITMAPV4HEADER)的,或是sizeof(BITMAPV5HEADER)的要根据文件的格式版本来决定,不,就在的情况来看,大多数的BMP像都是BITMAPINFOHEADER构的(可能是后两者太新的故吧:-)。
    biWidth
    象的度,以象素为单
    biHeight
    象的高度,以象素为单位。注:除了用于描述像的高度之外,它有另一个用,就是指明该图像是倒向的位是正向的位。如果该值是一个正数,像是倒向的,如果该值是一个数,则说像是正向的。大多数的BMP文件都是倒向的位,也就是,高度是一个正数。(注:当高度是一个(正向像),像将不能被压缩(也就是biCompression将不能是BI_RLE8BI_RLE4)。
    biPlanes
    标设备说明位面数,其是被设为1
    biBitCount
    明比特数/象素,其值为1481624、或32
    biCompression
    象数据压缩型。可以是下述之一:
    • BI_RGB:没有压缩
    • BI_RLE8个象素8比特的RLE压缩编码压缩格式由2节组(象素数和色索引)
    • BI_RLE4个象素4比特的RLE压缩编码压缩格式由2节组
    • BI_BITFIELDS:个象素的比特由指定的掩决定。
    biSizeImage
    象的大小,以字节为单位。当用BI_RGB格式,可0
    biXPelsPerMeter
    明水平分辨率,用象素/米表示
    biYPelsPerMeter
    明垂直分辨率,用象素/米表示
    biClrUsed
    明位图实际使用的彩色表中的色索引数(设为0则说明使用所有色板
    biClrImportant
    对图示有重要影响的色索引的数目,如果是0,表示都重要。

    就BITMAPINFOHEADER构作如下明:
    (1) 彩色表的定位
    用程序可使用存在biSize成中的信息来找在BITMAPINFO构中的彩色表,如下所示:
    pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo->bmiHeader.biSize))
    (2) biBitCount
    biBitCount=1 表示位最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这种颜色。像信息色板中将有两个色板,称索引0和索引1象数据列中的一位表示一个象素。如果一个位是0就使用索引0RGB,如果位是1使用索引1RGB
    biBitCount=4 表示位最多有16种颜色。个象素用4位表示,并用4位作彩色表的表象素的色。例如,如果位中的第一个字节为0x1F,它表示有两个象素,第一象素的色就在彩色表的第2找,而第二个象素的色就在彩色表的第16找。此色板中缺省情况下会有16RGB对应于索引0到索引15
    biBitCount=8 表示位最多有256种颜色。个象素用8位表示,并用8位作彩色表的表象素的色。例如,如果位中的第一个字节为0x1F个象素的色就在彩色表的第32找。此,缺省情况下,色板中会有256RGB对应于索引0到索引255
    biBitCount=16 表示位最多有216种颜色。个色素用16位(2个字)表示。这种格式叫作高彩色,或叫增16位色,或64K色。它的情况比较复杂,当biCompressionBI_RGB,它没有色板。16位中,最低的5位表示色分量,中5位表示绿色分量,高的5位表示色分量,一共占用了15位,最高的一位保留,设为0这种格式也被称作555 16位位。如果biCompressionBI_BITFIELDS,那情况就复杂了,首先是原来色板的位置被三个DWORD量占据,称为红绿。分用于描述绿分量在16位中所占的位置。在Windows 95(或98)中,系可接受两格式的位域:555565,在555格式下,绿的掩是:0x7C000x03E00x001F,而在565格式下,它们则别为0xF8000x07E00x001F。你在取一个像素之后,可以分用掩上像素,从而提取出想要的色分量(当然要再经过适当的左右移操作)。在NT中,没有格式限制,只不要求掩不能有重叠。(注:这种格式的像使用起来是比的,不它的示效果接近于真彩,而像数据又比真彩像小的多,所以,它更多的被用于游戏软件)。
    biBitCount=24 表示位最多有224种颜色。这种没有色板(bmiColors尺寸0),在位数中,3个字代表一个象素,分别对应RGB
    biBitCount=32 表示位最多有232种颜色。这种构与16位位图结构非常似,当biCompressionBI_RGB,它也没有色板,32位中有24位用于存放RGB序是:最高位保留,8位、绿8位、8位。这种格式也被成888 32。如果 biCompressionBI_BITFIELDS,原来色板的位置将被三个DWORD量占据,成为红绿,分用于描述绿分量在32位中所占的位置。在Windows 95(or 98)中,系只接受888格式,也就是三个掩将只能是:0xFF00000xFF000xFF。而在NT中,你只要注意使掩生重叠就行。(注:这种图像格式比较规整,因它是DWORD对齐的,所以在内存中汇编级的代码优化(简单))。
    (3) ClrUsed
    BITMAPINFOHEADER构中的成ClrUsed指定实际使用的色数目。如果ClrUsed置成0,位使用的色数目就等于biBitCount成中的数目。注意,如果ClrUsed不是可用色的最大或不是0时应该注意色板尺寸的算,比如在4位位中,色板的缺省尺寸应该16sizeof(RGBQUAD),但是,如果ClrUsed不是16或者不是0,那么调色板的尺寸就应该ClrUsedsizeof(RGBQUAD)
    (4) 象数据压缩
    ① BI_RLE8个象素8比特的RLE压缩编码,可使用编码方式和绝对方式中的任何一种进压缩方式可在同一幅中的任何地方使用。
    编码方式:由2个字节组成,第一个字指定使用相同色的象素数目,第二个字指定使用的色索引。此外,个字节对中的第一个字0合使用第二个字表示:
    • 第二个字值为0:行的束。
    • 第二个字值为1束。
    • 第二个字值为2:其后的两个字表示下一个象素从当前始的水平和垂直位置的偏移量。
    绝对方式:第一个字节设0,而第二个字节设0x030xFF的一个。在这种方式中,第二个字表示跟在个字后面的字数,个字包含个象素的色索引。压缩数据格式需要字(word boundary)对齐。下面的例子是用16制表示的8-压缩图象数据:
    03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01 02 78 00 00 09 1E 00 01
    压缩数据可解释为
    压缩数据 
    展数据
    03 04
    04 04 04 
    05 06
    06 06 06 06 06 
    00 03 45 56 67 00
    45 56 67 
    02 78
    78 78 
    00 02 05 01
    从当前位置右移5个位置后向下移一行
    02 78
    78 78 
    00 00
    09 1E
    1E 1E 1E 1E 1E 1E 1E 1E 1E 
    00 01
    RLE编码图束 
    ② BI_RLE4个象素4比特的RLE压缩编码,同也可使用编码方式和绝对方式中的任何一种进压缩方式也可在同一幅中的任何地方使用。方式是:
    编码方式:由2个字节组成,第一个字指定象素数目,第二个字包含两种颜色索引,一个在高4位,另一个在低4位。第一个象素使用高4位的色索引,第二个使用低4位的色索引,第3个使用高4位的色索引,依此推。
    绝对方式:个字节对中的第一个字节设0,第二个字包含有色索引数,其后包含有色索引,色索引存放在的高、低4位中,一个色索引对应一个象素。此外,BI_RLE4也同样联合使用第二个字中的表示:
    • 第二个字值为0:行的束。
    • 第二个字值为1束。
    • 第二个字值为2:其后的两个字表示下一个象素从当前始的水平和垂直位置的偏移量。
    下面的例子是用16制数表示的4-压缩图象数据:
    03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 04 78 00 00 09 1E 00 01
    压缩数据可解释为
    压缩数据
    展数据
    03 04
    0 4 0
    05 06
    0 6 0 6 0 
    00 06 45 56 67 00
    4 5 5 6 6 7 
    04 78
    7 8 7 8 
    00 02 05 01
    从当前位置右移5个位置后向下移一行
    04 78
    7 8 7 8 
    00 00
    09 1E
    1 E 1 E 1 E 1 E 1 
    00 01
    RLE束 
    3. 彩色表
    彩色表包含的元素与位所具有的色数相同,象素的色用RGBQUAD构来定24-位真彩色象就不使用彩色表(同也包括16位、和32位位),因中的RGB就代表了个象素的色。彩色表中的色按色的重要性排序,可以驱动程序不能示足色数的设备显示彩色象。RGBQUAD构描述由RGB对强成的色,定如下:
    typedef struct tagRGBQUAD { /* rgbq */
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;
    } RGBQUAD;
     
    其中: 

    rgbBlue
    指定
    rgbGreen
    指定绿
    rgbRed
    指定
    rgbReserved
    保留,0

    4. 位数据
    跟在彩色表之后的是象数据字节阵列。象的描行由表示象象素的连续的字节组成,一行的字数取决于象的色数目和用象素表示的度。描行是由底向上存的,就是列中的第一个字表示位左下角的象素,而最后一个字表示位右上角的象素。(只针对与倒向DIB,如果是正向DIB则扫描行是由向下存的),倒向DIB的原点在像的左下角,而正向DIB的原点在像的左上角。同描行的字数必需是4的整倍数,也就是DWORD对齐的。如果你想确保像的描行DWORD对齐,可使用下面的代
    (((width*biBitCount)+31)>>5)<<2
    5. 参考
    象文件格式(上、下)—Windows程》
    像文件格式大全》
    Programming Windows by Charles Petzold
    二,实例分析
    BMP格式像文件<作者:LEFE>
    首先注意所有的数在存上都是按高位放高位、低位放低位的原,如12345678h放在存器中就是7856 3412)。下出来的画的第一张图加上文件后的16制数据,以此行分析。T408中的像有点怪,像是在电脑上看是垂直翻的。在分析中化叙述,以一个字(两个字,如424D就是一个字)序号行,“h”表示是16制数。
    424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 01001000 0300
    0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 000000F8 0000 E007 0000 1F00
    0000 0000 000002F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2
    ......
    BMP文件可分四个部分:位文件、位信息、彩色板、像数据列,在上中已用*分隔。
    一、像文件
    11像文件424Dh=’BM’,表示是Windows支持的BMP格式。
    2
    2-3:整个文件大小。4690 000000009046h=36934
    3
    4-5:保留,必须设0
    4
    6-7:从文件始到位数据之的偏移量。4600 000000000046h=70,上面的文件就是35=70
    5
    8-9:位图图信息头长度。
    6
    10-11:位图宽度,以像素为单位。8000 000000000080h=128
    7
    12-13:位高度,以像素为单位。9000 000000000090h=144
    8
    14:位的位面数,该值总101000001h=1
    二、位信息
    915个像素的位数。有1色),416色),8256色),1664K色,高彩色),2416M色,真彩色),324096M色,增型真彩色)。T408支持的是16位格式。10000010h=16
    1016-17压缩说明:有0(不压缩),1RLE 88RLE压缩),2RLE 44RLE压缩3Bitfields,位域存放)。RLE简单是采用像素数+像素的方式压缩T408采用的是位域存放方式,用两个字表示一个像素,位域分配r5b6g50300 000000000003h=3
    1118-19:用字数表示的位数据的大小,数必4的倍数,数上等于位图宽×高度×个像素位数。0090 000000009000h=80×90×2h=36864
    12
    20-21:用象素/米表示的水平分辨率。A00F 00000000 0FA0h=4000
    13
    22-23:用象素/米表示的垂直分辨率。A00F 00000000 0FA0h=4000
    14
    24-25:位使用的色索引数。设为0则说明使用所有色板
    15
    26-27对图示有重要影响的色索引的数目。如果是0,表示都重要。
    三、彩色板
    1628-35:彩色板范。色板中的个表,用下述方法来描述RGB
      1
    用于色分量
      1
    用于绿色分量

      1
    用于色分量

      1
    用于填充符(
    0)
     
    24-位真彩色像就不使用彩色表,因中的RGB就代表了个象素的色。但是16r5g6b5位域彩色像需要彩色表,看前面的,与上面的解不太得上,以下面的解释为准。
    中彩色板 00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
    00F8 0000
    F800h=1111100000000000(二制),是色分量的掩

    E007 0000
    07E0h=0000011111100000(二制),是绿色分量的掩

    1F00 0000001Fh=0000000000011111(二制),是色分量的掩

    0000 0000
    总设0
    将掩跟像素值进运算再行移位操作就可以得到各色分量。看看掩,就可以明白事上在个像素的两个字16位中,按从高到低取565位分就是rgb分量。取出分量后把rgb乘以848就可以补齐每个分量一个字,再把三个字rgb合,放入存器(同要反序),就可以转换为24BMP格式了。
    四、像数据
    17)36-...:两个字表示一个像素。列中的第一个字表示位左下角的象素,而最后一个字表示位右上角的象素。
    按照前述r5g6b5彩色板范,我们对图像最左下角手机上像的的像素在24位模式中的rgb值进行推算(由于垂直翻个像素在手机上看来实际 上在左上角):
      02F1
    F102h
      r=(F102 AND F800)/ 800 × 8 h= F0h=240
      g=(F102 AND 07E0)/ 20 × 4 h=20h=32
      b=(F102 AND 001F)× 8 h= 10h=16
      rgb=F02010h,放在存
    器中
    1020F0h。
    在Photoshop中
    一下色,rgb取240、32、16可以看到是近色。
    展开全文
  • BMP图像格式分析

    千次阅读 2009-02-13 15:45:00
    BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且 Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也已经成为PC机上的流行...

    BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且 Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也已经成为PC机上的流行图像文件格 式。它的主要特点可以概括为:文件结构与PCX文件格式类似,每个文件只能存放一幅图像;图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理成为图 像文件的一个选项,用户可以根据需要进行选择。其中,非压缩格式是BMP图像文件所 采用的一种通用格式。但是,如果用户确定将BMP文件格式压缩处理,则Windows设计 了两种压缩方式:如果图像为16色模式,则采用RLE4压缩方式,若图像为256色模式, 则采用RLE8压缩方式。同时,BMP图像文件格式可以存储单色、16色、256色以及真彩 色四种图像数据,,其数据的排列顺序与一般文件不同,它以图像的左下角为起点存储图 像,而不是以图像的左上角为起点;而且BMP图像文件格式中还存在另外一个与众不同 的特点,即其调色板数据所采用的数据结构中,红、绿、蓝三种基色数据的排列顺序也 恰好与其它图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境 的新特色,而且随着Windows版本的不断更新,微软公司也在不断改进其BMP图像文件 格式,例如:当前BMP图像文件版本中允许采用32位颜色表,而且针对32位Windows 的产生,相应的API函数也在不断地报陈出新,这些无疑都同时促成了BMP文件格式的 不断风靡。但由于BMP文件格式只适合于Windows上的应用软件,而对于DOS环境中的 各种应用软件则无法提供相应的支持手段,因此这无疑是阻碍BMP文件格式的流通程度超过PCX文件格式的一个重要因素。

    Windows中定义了两种位图文件类型,即一般位图文件格式与设备无关位图文件格 式。其中,由于设备无关位图(DIB)文件格式具有更强的灵活性与完整的图像数据、 压缩方式等定义。BMP图像文件的结构可以分为如下三个部分:文件头、调色板数据以 及图像数据。其中文件头的长度为固定值54个字节;调色板数据对所有不超过256色的 图像模式都需要进行设置,即使是单色图像模式也不例外,但是对于真彩色图像模式, 其对应的BMP文件结构中却不存在相应调色板数据的设置信息;图像数据既可以采用一 定的压缩算法进行处理,也可以不必对图像数据进行压缩处理,这不仅与图像文件的大小相关,而且也与对应的图像处理软件是否支持经过压缩处理的BMP图像文件相关。以下将分别介绍BMP图像文件结构中的这三个重要组成部分。特别值得注意的是:BMP 图像文件结构设计得相当简单,这无疑有利于图像文件的处理速度,但是同时也使得 BMP图像文件格式具有一定的局限性,即一个BMP图像文件只能存储一幅图像。

    BMP图像文件的文件头定义

    Windows中将BMP图像文件的文件头分成两个数据结构,其中一个数据结构中包含 BMP文件的类型、大小和打印格式等信息,称为BITMAPFILEHEADERl另外一个数据 结构中则包含BMP文件的尺寸定义等信息,称为BITMAPINFOHEADERl如果图像文 件还需要调色板数据,则将其存放在文件头信息之后。 BITMAPFIlEHEADER数据结构在Windows.h中的定义为:

    typedef struCttagBITMAPFIlEHEADER

    {

    WORD bftype;

    DWORD bfsiZe:

    WORD bfReservedl;

    WORD bgReserved2:

    DWORD bfoffBits:

    }BITMAPFILEHEADER;

    其中,bfrype在图像文件存储空间中的数据地址为0,数据类型为unsignedchar,内 容为固定值“BM”,用于标志文件格式,表示该图像文件为BMP文件。

    bfsize的数据地址为2,类型为unsignedlong,它以字节为单位,定义位图文件的大 小。

    bfReservedl与bfReserved2的数据地址分别为6和8,数据类型则都为unsignedint,二 者都是BMP文件的保留字,没有任何意义,其值必须为0.

    bfoffBits的数据地址为10,数据类型为unsignedlong,它以字节为单位,指示图像 数据在文件内的起始地址,即图像数据针对文件头的偏移量。

    BITMAPINFOHEADER数据结构用于说明位图的大小,其定义为:

    type struttagBITMAPINFOHEADER

    {

    DWORD biSize:

    DWORD biWldth;

    DWORD biHeight;

    WORD biPlanes:

    WORD biBitCount:

    DWORD biCOmpression;

    DWORD biSiZelmage;

    DWORD biXPelsPerMeter:

    DWORD biYPelsPerMeter:

    DWORD biClrUsed;

    DWORD biClrlmportant;

    }BITMAPINFOHEADER;

    其中,biSize的数据地址为14,数据类型为unsignedlong,它以字节为单位指定数据 结构BITMAPINFOHEADER所占用的存储容量,固定值为40。

    biWidth与biHeight的数据地址分别为18和22,数据类型都是unsignedlong,它们分 别以像素为单位,给出该BMP文件所描述位图的宽度与高度。若biHeight的取值为正数, 则表明位图为bottom—up类型的DIB位图,而且位图原点为左下角。若biHeight的取值为 负数,则表明位图为top—down类型的DIB位图,而且位图原点为左上角。

    注意:一般位图定义中,这两个字段的取值必须为正数。

    biPlanes的数据地址为26,类型为unsignedint,它代表目标设备的平面数必须为1。

    biBitCount的数据地址为28,类型为utlsigned Int,它确定每个像素所需要的位数。 当图像为单色时,该字段的取值为1;当图像为16色时,该字段的取值为4;当图像为256 色时,该字段的取值为8;当图像为真彩色时,该字段的取值为24。

    biCompression的数据地址为30,类型为unsignedlong,它代表bottom—up类型位图的 压缩类型(注意:t叩—down类型位图不能进行压缩处理),其可能取值及其含义分别为: 若该字段的取值为BI—RGB,则表示文件内的图像数据没有经过压缩处理;若该字段的 取值为BI—RLE8,则表示所压缩的图像数据是256色,采用的压缩方法是RLE8;若该字 段的取值为BI—RLE4,则表示所压缩的图像数据是16色,采用的压缩方法是RLE4;若 该字段的取值为BI—BITFIELDS,则表明图像文件内的数据没有经过压缩处理,而且颜 色表由分别表示每个像素点的红、绿、蓝三原色的双字组成。

    注意:BMP文件格式在处理单色或者真彩色图像时,不论图像数据多么庞大,都不 对图像数据进行任何压缩处理。

    biSizelmage的数据地址为34,类型为unsignedlong7它以字节为单位,给出该BMP 内图像数据占用的空间大小。若图像文件描述BI—RGB位图,则该字段的值必须设置为0。

    biXPelsPerMeter字段与biYPelsPerMeter字段的数据地址分别为38与42,类型都是 unsignedlong,它们分别以每米像素数为单位,给出位图目的设备水平以及垂直方向的 分辨率;其中,应用程序可以根据biXPelsPerMeter字段的值,从源位图组中选择与当前 设备特点最匹配的位图。

    biCkUsed的数据地址为46,类型为unsignedlong,给出位图实际使用的颜色表中的 颜色变址数。如果该字段的取值为0,则代表本位图使用了biBitCount字段值所代表的最 大颜色值,其中biBitCount字段的取值与biCompression所指定的压缩方法相关。例如: 如果图像为16色,而该字段的取值为10,则代表本位图共使用了12种颜色;如果该字段 的取值非零,而且biBitCount字段的取值小于16,则该字段指定图像或者设备驱动器存 取的实际颜色数。若biBitCount字段的取值大于或者等于16,则该字段指定使Window 系统调色板达到最优性能的颜色表大小。

    biChlmportant的数据地址为50,数据类型为unsignedlong,它给出位图显示过程中 重要颜色的变址数。若该字段的取值为0,则表示所有使用的颜色都是重要颜色。

    调色板数据

    如果位图的描述还需要调色板数据,则应该在BMP文件头之后定义一个颜色表,它 包含若干个表项。其中,每一个表项定义了一种颜色,Windows将其定义为如下的 RGBQUAD结构:

    typedef tagRGBQUAD

    {

    BYTE rgbBlue;

    BYTE rgbGreen;

    BYTE rgbRed;

    BYTE rgbReserved;

    }RGBQUAD;

    注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何意 义,必须取固定值00同时,RGBQUAD结构定义的颜色值中,红色、绿色与蓝色的排 列顺序与一般图像文件的颜色数据排列顺序恰好相反,即:蓝色的亮度由rgbBlue字段 定义、绿色的亮度由rgbGreen字段定义,红色的亮度由rgbRed字段定义。若位图中某个 像素点的颜色描述为“00,00,FF,00”,则表示该点的颜色为纯红色,而不是纯 蓝色。

    综上,在DIB位图文件组成中,紧随BITMAPFILEHEADER结构其后的数据结构为 BITMAPINFO,两者共同构成完整的位图文件。Windows将BITMAPINFO结构定义为:

    tyPedef stmCt tagBITMAPINFO

    {

    BITMAPINFOHEADER bmiHeader:

    RGBQUAD bmiC010ur[1];

    }BITMAPINFO;

    其中,bmiHeader字段指向包含位图颜色格式以及大小定义的 BITMAPHEADERINFO结构。bmiCo1our[1]字段指向RGBQUAD结构数组或者定义位图 颜色值的双字数据结构,它定义了BMP图像文件的颜色表,它包含多少个表项是由 BITMAPINFOHEADER数据结构中的biBitCount字段定义的:若该字段的取值为1,则颜 色表中共包含两个表项;若该字段的取值为4,则颜色表中共包含16个表项;若该字段 的取值为8,则颜色表中共包含256个表项;若该字段的取值为16,而且 BITMAPINFOHEADER结构定义中指定bmiColors字段的取值为BI_RGB,则颜色表中的 表项为空,位图阵列中每个字代表一个像素,字中每5位上的值代表该像素点一种基色 的亮度,其中最低5位代表蓝色亮度,依次为绿色与红色,字的最高位没有任何意义。 若该字段的取值为24,则颜色表中的表项为空,而位图阵列的每三个字节代表一个像 素,这3个字节直接定义了像素颜色中蓝、绿、红三种基色的相对亮度。 若该字段的取 值为32,而且BITMAPINFOHEADER结构定义中bmiC010rs字段的取值为BI—RGB,则颜 色表中的表项为空,且位图阵列中的每个双字代表一个像素的三原色亮度构成。 注意:颜色表中的数据应该按照重要性的帧序进行排列。另外,如果应用程序中需 要使用DIB位图,则bmiColors字段可以为16位的无符号整数数组,这些整数指定当前逻 辑调色板的颜色索引,而不是显式的RGB值。当然,如果位图存储在文件中或者需要传 送到其它应用程序,则该字段中不能包含调色板索引值。

     

    一、BMP文件结构  
       
      BMP文件组成  
      BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。    
      BMP文件头  
      BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。    
      其结构定义如下:  
      typedef   struct   tagBITMAPFILEHEADER  
      {  
      WORDbfType;   //   位图文件的类型,必须为BM  
      DWORD   bfSize;   //   位图文件的大小,以字节为单位    
      WORDbfReserved1;   //   位图文件保留字,必须为0  
      WORDbfReserved2;   //   位图文件保留字,必须为0  
      DWORD   bfOffBits;   //   位图数据的起始位置,以相对于位图  
      //   文件头的偏移量表示,以字节为单位  
      }   BITMAPFILEHEADER;  
       
       
      3.   位图信息头  
       
       
      BMP位图信息头数据用于说明位图的尺寸等信息。  
      typedef   struct   tagBITMAPINFOHEADER{  
      DWORD   biSize;   //   本结构所占用字节数  
      LONGbiWidth;   //   位图的宽度,以像素为单位  
      LONGbiHeight;   //   位图的高度,以像素为单位  
      WORD   biPlanes;   //   目标设备的级别,必须为1  
      WORD   biBitCount//   每个像素所需的位数,必须是1(双色),  
      //   4(16色),8(256色)或24(真彩色)之一  
      DWORD   biCompression;   //   位图压缩类型,必须是   0(不压缩),  
      //   1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一  
      DWORD   biSizeImage;   //   位图的大小,以字节为单位  
      LONGbiXPelsPerMeter;   //   位图水平分辨率,每米像素数  
      LONGbiYPelsPerMeter;   //   位图垂直分辨率,每米像素数  
      DWORD   biClrUsed;//   位图实际使用的颜色表中的颜色数  
      DWORD   biClrImportant;//   位图显示过程中重要的颜色数  
      }   BITMAPINFOHEADER;  
       
       
      4.   颜色表  
       
        颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:  
      typedef   struct   tagRGBQUAD   {  
      BYTErgbBlue;//   蓝色的亮度(值范围为0-255)  
      BYTErgbGreen;   //   绿色的亮度(值范围为0-255)  
      BYTErgbRed;   //   红色的亮度(值范围为0-255)  
      BYTErgbReserved;//   保留,必须为0  
      }   RGBQUAD;  
      颜色表中RGBQUAD结构数据的个数有biBitCount来确定:  
      当biBitCount=1,4,8时,分别有2,16,256个表项;  
      当biBitCount=24时,没有颜色表项。  
      位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:  
      typedef   struct   tagBITMAPINFO   {  
      BITMAPINFOHEADER   bmiHeader;   //   位图信息头  
      RGBQUAD   bmiColors[1];   //   颜色表  
      }   BITMAPINFO;  
       
       
      5.   位图数据  
        位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:  
      当biBitCount=1时,8个像素占1个字节;  
      当biBitCount=4时,2个像素占1个字节;  
      当biBitCount=8时,1个像素占1个字节;  
      当biBitCount=24时,1个像素占3个字节;  
      Windows规定一个扫描行所占的字节数必须是  
      4的倍数(即以long为单位),不足的以0填充,  
      一个扫描行所占的字节数计算方法:  
      DataSizePerLine=   (biWidth*   biBitCount+31)/8;    
      //   一个扫描行所占的字节数  
      DataSizePerLine=   DataSizePerLine/4*4;   //   字节数必须是4的倍数  
      位图数据的大小(不压缩情况下):  
      DataSize=   DataSizePerLine*   biHeight;

    展开全文
  • BMP位图格式分析

    2013-03-25 09:27:00
    如下是我打开BMP文件的相应函数,结果图片能显示在视图中,但是却不对,图片是斜的,是倒置的,不理解,求指点 void CBMPView::OnFileOpen() { // TODO: 在此添加命令处理程序代码 CFileDialog fileDlg(TRUE...
  • 位图(bmp)文件格式分析

    万次阅读 多人点赞 2018-05-29 19:18:24
    位图(bmp)文件格式分析 作者:深蓝(由博主分享) 一、什么是位图 计算机能以位图和矢量图格式显示图像。 1、位图(Bitmap): 图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述...

    from:https://blog.csdn.net/qingchuwudi/article/details/25785307

    位图(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这三部分。

    ------------------------------------------------------------------------------------------------------------------------------------------------

    看图像属性,位深度,如果是24,就说明图片是24位真彩色

    ------------------------------------------------------------------------------------------------------------------------------------------------

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

     

    1、1位图文件头(BITMAPFILEHEADER

     

    位图文件头分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位图信息头(BITMAPINFOHEADER )

    位图信息头共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:文章最后注的内容将由下篇文章解释

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    from:https://www.cnblogs.com/lzlsky/archive/2012/08/16/2641698.html

    BITMAPFILEHEADER、BITMAPINFOHEADER及BMP结构详解

    位图BITMAPINFOHEADER 与BITMAPFILEHEADER:

    先来看BITMAPINFOHEADER,只写几个主要的

        biSize包含的是这个结构体的大小(包括颜色表)

        biWidth和biHeight分别是图片的长宽

        biPlanes是目标绘图设备包含的层数,必须设置为1

        biBitCount是图像的位数,例如24位,8位等

        biXPelsPerMeter, biYPelsPerMeter 是现实世界中每米包含的像素数 设为3780即可

        biSizeImage 图像数据的大小 = biWidth X biHeight X biBitCount

        ---------------------------------------------------------------------------------

        再看 BITMAPFILEHEADER

        bfType  图片的类型 必须是BM 填0x4d42即十进制的19778

        bfOffBits 从文件头开始到颜色数据的偏移量  54+sizeof(RGBQUAD)*256

        bfSize  图片的大小,bfOffBits + 长 X 宽 X 位数  例如对于128X128X24位的图像  bfSize=128X128X24 + 54+sizeof(RGBQUAD)*256

        bfReserved1和bfReserved1必须为0

    BMP文件结构及其存取

    数字图像在外存储器设备中的存储形式是图像文件,图像必须按照某个已知的、公认的数据存储顺序和结构进行存储,才能使不同的程序对图像文件顺利进行打开或存盘操作,实现数据共享。图像数据在文件中的存储顺序和结构称为图像文件格式。目前广为流传的图像文件格式有许多种,常见的格式包括BMP、 GIF、JPEG、TIFF、PSD、DICOM、MPEG等。在各种图像文件格式中,一部分是由某个软硬件厂商提出并被广泛接受和采用的格式,例如 BMP、GIF和PSD格式;另一部分是由各种国际标准组织提出的格式,例如JPEG、TIFF和DICOM,其中JPEG是国际静止图像压缩标准组织提出的格式,TIFF是由部分厂商组织提出的格式,DICOM是医学图像国际标准组织提出的医学图像专用格式。

    BMP文件是Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件,因其文件扩展名为BMP,故称为BMP文件格式,简称BMP文件。本书对图像的算法编程都是针对BMP图像文件的,因此在本章中我们详细介绍BMP文件结构及其读写操作,以加深对图像数据的理解。

    BMP文件总体上由4部分组成,分别是位图文件头、位图信息头、调色板和图像数据,如表5-1所示。

    表5-1 BMP文件的组成结构

    位图文件头(bitmap-file header)14bytes

    位图信息头(bitmap-information header)40bytes

    彩色表/调色板(color table)

    位图数据(bitmap-data)

    下面来详细看一下每个组成部分的细节。

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

    位图文件头(bitmap-file header)包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段。

    打开WINGDI.h文件,搜索"BITMAPFILEHEADER"就可以定位到BMP文件的位图文件头的数据结构定义。

    typedef struct tagBITMAPFILEHEADER { 
    WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits; 
    } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

    表5-2列出了tagBITMAPFILEHEADER中各字段的含义。

    表5-2 tagBITMAPFILEHEADER结构

    字 段 名

    大小(单位:字节)

    描 述

    bfType

    2

    位图类别,根据不同的操作系统而不同,在Windows中,此字段的值总为‘BM’

    bfSize

    4

    BMP图像文件的大小

    bfReserved1

    2

    总为0

    bfReserved2

    2

    总为0

    bfOffBits

    4

    BMP图像数据的地址

    2.位图信息头(bitmap-information header)

    位图信息头(bitmap-information header)包含了位图信息头的大小、图像的宽高、图像的色深、压缩说明图像数据的大小和其他一些参数。

    打开WINGDI.h文件,搜索"tagBITMAPINFOHEADER"就可以定位到BMP文件的位图信息头的数据结构定义。

    typedef struct tagBITMAPINFOHEADER{ 
    DWORD      biSize; 
    LONG        biWidth; 
    LONG        biHeight; 
    WORD       biPlanes; 
    WORD       biBitCount; 
    DWORD      biCompression; 
    DWORD      biSizeImage; 
    LONG        biXPelsPerMeter; 
    LONG        biYPelsPerMeter; 
    DWORD      biClrUsed; 
    DWORD      biClrImportant; 
    } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

    表5-3列出了tagBITMAPFILEHEADER中各字段的含义。

    表5-3 tagBITMAPFILEHEADER结构

    字 段 名

    大小

    (单位:

    字节)

    描 述

    biSize

    4

    本结构的大小,根据不同的操作系统而不同,在Windows中,此字段的值总为28h字节=40字节

    biWidth

    4

    BMP图像的宽度,单位像素

    biHeight

    4

    总为0

    biPlanes

    2

    总为0

    biBitCount

    2

    BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色

    biCompression

    4

    压缩方式,0表示不压缩,1表示RLE8压缩,2表示RLE4压缩,3表示每个像素值由指定的掩码决定

    biSizeImage

    4

    BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足

    biXPelsPerMeter

    4

    水平分辨率,单位像素/m

    biYPelsPerMeter

    4

    垂直分辨率,单位像素/m

    biClrUsed

    4

    BMP图像使用的颜色,0表示使用全部颜色,对于256色位图来说,此值为100h=256

    biClrImportant

    4

    重要的颜色数,此值为0时所有颜色都重要,对于使用调色板的BMP图像来说,当显卡不能够显示所有颜色时,此值将辅助驱动程序显示颜色

    3.彩色表/调色板(color table)

    彩色表/调色板(color table)是1色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像 的数据是指向调色板的索引。

    可以将调色板想象成一个数组,每个数组元素的大小为4字节,假设有一256色的BMP图像的调色板数据为:

    调色板[0]=黑、调色板[1]=白、调色板[2]=红、调色板[3]=蓝…调色板[255]=黄

    图像数据01 00 02 FF表示调用调色板[1]、调色板[0]、调色板[2]和调色板[255]中的数据来显示图像颜色。

    在早期的计算机中,显卡相对比较落后,不一定能保证显示所有颜色,所以在调色板中的颜色数据应尽可能将图像中主要的颜色按顺序排列在前面,位图信息 头的biClrImportant字段指出了有多少种颜色是重要的。

    每个调色板的大小为4字节,按蓝、绿、红存储一个颜色值。

    打开WINGDI.h文件,搜索"tagRGBTRIPLE"就可以定位到BMP文件的调色板的数据结构定义。

    typedef struct tagRGBQUAD { 
    BYTE    rgbBlue; 
    BYTE    rgbGreen; 
    BYTE    rgbRed; 
    BYTE    rgbReserved; 
    } RGBQUAD;

    表5-4列出了tagRGBTRIPLE中各字段的含义。

    表5-4 tagRGBTRIPLE结构

    字 段 名

    大小(单位:字节)

    描 述

    rgbBlue

    1

    蓝色值

    rgbGreen

    1

    绿色值

    rgbRed

    1

    红色值

    rgbReserved

    1

    保留,总为0

    4.位图数据(bitmap-data)

    如果图像是单色、16色和256色,则紧跟着调色板的是位图数据,位图数据是指向调色板的索引序号。

    如果位图是16位、24位和32位色,则图像文件中不保留调色板,即不存在调色板,图像的颜色直接在位图数据中给出。

    16位图像使用2字节保存颜色值,常见有两种格式:5位红5位绿5位蓝和5位红6位绿5位蓝,即555格式和565格式。555格式只使用了15 位,最后一位保留,设为0。

    24位图像使用3字节保存颜色值,每一个字节代表一种颜色,按红、绿、蓝排列。

    32位图像使用4字节保存颜色值,每一个字节代表一种颜色,除了原来的红、绿、蓝,还有Alpha通道,即透明色。

    如果图像带有调色板,则位图数据可以根据需要选择压缩与不压缩,如果选择压缩,则根据BMP图像是16色或256色,采用RLE4或RLE8压缩算 法压缩。

    RLE4是压缩16色图像数据的,RLE4采用表5-5所示方式压缩数据。

    表5-5 RLE4压缩方法

    方 案

    1字节

    2字节

    3字节

    4字节

    N字节

    A

    重复次数

    颜色索引

       

    B

    设为0

    后面有效的

    颜色索引数

    颜色索引

    颜色索引

    颜色索引…

    假设有如下16色位图数据,共20字节,数据使用了RLE4压缩:

    05 00 04 05 00 08 09 05 04 00 04 05 08 09 04 08 07 01 00 00

    数据解压时首先读取05,因为05不等于0,所以选择A方案,根据A方案,05表示后面数据重复的次数,接着读取00,00表示有两个颜色索引,每 个索引占4位,第一个像素在高4位,第二个像素在低4位,即在一个字节中低像素在高位,高像素在低位。05 00解压后等于00 00 0。

    读取04,选择A方案,按照上面的操作解析,04是后面数据重复的次数,05是两个颜色索引,第3个颜色索引为5,第4个颜色索引为0。04 05解压后等于05 05。

    读取00,选择B方案,读取08,08表示后面有效的颜色索引数。00 08解压后等于09 05 04 00。

    读取04,选择A方案,按照上面的操作解析,04是后面数据重复的次数,05是两个颜色索引。04 05解压后等于05 05。

    读取08,选择A方案,按照上面的操作解析,08是后面数据重复的次数,09是两个颜色索引。08 09解压后等于09 09 09 09。 
    读 取04,选择A方案,按照上面的操作解析,04是后面数据重复的次数,08是两个颜色索引。04 08解压后等于08 08。

    读取07,选择A方案,按照上面的操作解析,07是后面数据重复的次数,01是两个颜色索引。07 01解压后等于01 01 01 0。

    读取00,选择B方案,读取00,00表示后面有效的颜色索引数,0表示无,即解压完一行数据。

    综合上面的操作,解压后的数据为:

    00 00 00 50 50 90 50 40 00 50 50 90 90 90 90 80 80 10 10 10

    看上去和原来的数据大小一样,没有体现到压缩效果,这是因为上面的例子只选择了20字节数据,而且这20字节数据中重复的数据不多,使用RLE压缩 重复数据不多的数据时,有时可能压缩后的大小反而比原来的数据还大。其实一般情况下当数据比较多而且重复的时候,使用RLE压缩效果还是比较理想的。

    RLE8的压缩方式可以参考上面的RLE4解压方法,惟一的区别是RLE8使用1个字节存放颜色索引,而RLE4使用4位存放颜色索引。

    结合上面对BMP文件的分析,下面分别对256色和24位色的BMP图像进行十六进制分析,通过在十六进制编辑器中分析文件结构,能够增加分析文件 的经验。

    如图5-1和图5-2所示,分别为256色BMP图像cat2.bmp和24位色BMP图像cat1.bmp。其中cat2.bmp图像的分辨率为 200×153,文件大小为31 680字节。cat1.bmp图像的分辨率为200×150,文件大小为90 056字节。

    clip_image001

    图5-1  cat2.bmp图像(256色BMP图像cat2.bmp,分辨率为 200×153,文件大小为31 680字节)

    clip_image002

    图5-2  cat1.bmp图像(24位色BMP图像cat1.bmp,分辨率为200×150,文件大小为90 056字节)

    现 在来分析cat2.bmp的图像文件,在Winhex中打开cat2.bmp,如图5-3所示。

    (点击查看大图)图5-3  在Winhex中打开cat2.bmp图像文件((256色BMP图像cat2.bmp,分辨率为 200×153,文件大小为31 680字节))

    首先分析位图文件头的结构,如图5-4所示。根据 BMP文件的位图文件头结构定义分析出cat2.bmp图像的位图文件头中各字段的含义,如表5-6所示。

    (点击查看大图)图5-4  cat2.bmp图像文件的位图文件头

    表5-6 cat2.bmp图像文件中位图文件头各字段的含义

    十六进制值

    描 述

    42 4D:

    BM的ASCII值,在Windows中的BMP文件标识符

    C0 7B 00 00

    7B C0h=31680,是cat2文件的大小

    00 00 00 00

    保留值,总为0

    36 04 00

    436h=1078,是图像数据的地址,即文件头+信息头+调色板的长度

    继续分析接下来的数据,根据BMP文件结构的定义,接下来的数据是位图信息头,cat2.bmp图像文件的位图信息头的内容如图5-5所示。

    (点击查看大图)图5-5  cat2.bmp图像的位图信息头(0x00000000-E ~ 0x00000030-5)

    表5-7所示为cat2.bmp图像文件中位图信息头各字段的含义。

    表5-7 cat2.bmp图像文件中位图信息头各字段的含义

    十六进制值

    描 述

    28 00 00 00:

    cat2.bmp图像的位图信息头大小

    C8 00 00 00

    00 00 00 C8 = 200,是cat2图像的宽度,单位像素

    99 00 00 00

    00 00 00 99 = 153,是cat2图像的高度,单位像素

    01 00

    总是1

    08 00

    00 08 = 8,cat2图像的色深,即2的8次幂等于256色

    00 00 00 00

    压缩方式,0表示不压缩

    8A 77 00 00

    00 00 77 8A = 30602,是cat2图像的图像数据大小,单位字节

    12 0B 00 00

    00 00 0B 12 = 2834,cat2图像的水平分辨率,单位像素/m

    12 0B 00 00

    00 00 0B 12 = 2834,cat2图像的垂直

    分辨率,单位像素/m

    00 00 00 00

    cat2图像使用的颜色数,0表示使用全部颜色

    00 00 00 00

    cat2图像中重要的颜色数,0表示所有颜色都重要

    继续分析接下来的数据,根据BMP文件结构的定义,因为cat2.bmp图像是256色的位图,所以应该有256个调色板,每个调色板占4字节,整 个调色板一共1024字节大小。 cat2.bmp图像文件的调色板数据如图5-6和图5-7所示

    (点击查看大图)图5-6  cat2.bmp图像的调色板地址从00000036h开始存储

    (点击查看大图)图5-7  cat2.bmp图像的调色板数据结束地址是00000435h

    从图5-6和图5-7中可以看出,cat2.bmp图像的调色板地址从00000036h开始到00000435h结束,即00000435h - 00000036h + 1 =400h = 1024 bytes。

    如果想查看cat2图像的调色板对应的实际显示颜色,可以使用Adobe Photoshop CS打开cat2.bmp,在Adobe Photoshop CS的菜单栏中选择"图像"→"模式"→"颜色表",即可观看cat2的调色板,如图5-8所示。

    图5-8  在Adobe Photoshop CS中查看cat2的调色板(16 X 16 )

    图5-8所示cat2.bmp的调色板颜色和图5-6中的十六进制数据是一一对应的。在Adobe Photoshop CS的调色板上单击任何一个像素的颜色即可弹出一个拾色器对话框显示该像素颜色的详细组成信息。cat2.bmp调色板和cat2.bmp的十六进制数据 的对应关系如图5-9所示。

    继续分析接下来的数据,根据BMP文件结构的定义,如果一个图像有调色板,那么紧跟在调色板后面的是图像的数据,这些数据不是实际的颜色值,而是指 向调色板数组的索引,根据索引来获取调色板中的颜色,如图5-10所示。

    (点击查看大图)图5-9  cat2.bmp调色板和cat2.bmp的十六进制数据的对应关系

    (点击查看大图)图5-10  cat2.bmp的图像数据

    因为cat2.bmp是256色的位图,即采用了8位色深作为指向调色板数组的索引,所以根据图5-10中显示的数据可以得知:49 49 49 B1 49 49 49 49 49 99。表示cat2.bmp位图左下角第1个像素的颜色等于调色板[49];第2个像素的颜色等于调色板[49] ;第3个像素的颜色等于调色板[49] ;第4个像素的颜色等于调色板[B1];第5个像素的颜色等于调色板[49] ……依此类推。

     

    cat1.bmp图像是24位色图像,根据BMP文件结构定义得知,cat1.bmp图像没有调色板,图像数据存储的是实际的颜色数据,每个像素用 3字节表示,分别是红绿蓝。由于cat1.bmp和cat2.bmp的位图文件头和位图信息头结构一样,所以cat1.bmp的位图文件头和位图信息头可 以参考上面对cat2.bmp的分析,下面从cat1.bmp的位图信息头结束的位置开始分析,如图5-11所示。

    (点击查看大图)图5-11  cat1.bmp图像的图像数据((24位色BMP图像cat1.bmp,分辨率为200×150,文件大小为90 056字节))

    从图5-11可以看到表示每个像素的红绿蓝三色的值,实际存放的时候是倒过来存放的,在分析BMP图像格式时需要注意这点。

    通过上面对BMP文件存储结构的分析发现,BMP文件的位图文件头和位图信息头存在着大量的重复数据。如果存储大量同一色深的BMP位图,必然会浪 费大量存储空间,所以很多时候游戏编程人员都会去掉BMP文件头和信息头,只保留几个必要的信息和图像数据,那么BMP文件头和信息头中哪几个字段是必须 保留的呢?

    使用Winhex的文件比较功能比较两个24位色深的BMP图像文件,观察两个文件的文件头和信息头有什么不同的地方,如图5-12所示。

    (点击查看大图)图5-12  使用Winhex比较两个24位色深的BMP图像文件

    从图5-12可以看出,两个色深相同的BMP图像的文件头和信息头一共有4处不同的地方,分别是文件头的文件大小、信息头的图像宽度、图像高度和图 像数据大小。

    所以很多时候,游戏编程人员只保留图像文件的文件大小、图像宽度、图像高度和图像数据大小信息,甚至有时不需要保留文件大小这个数值,使用图像数据大小数值即可。

    在分析未知文件存储格式时,如果遇到去掉了文件头的文件时,如上面所说的BMP文件,会给分析未知文件格式带来一定的困难。这时需要使用十六进制编 辑器的文件比较功能,观察两个同类的未知文件格式寻找某些潜在的规律,如果实在观察不出规律的,那只能使用白盒分析方法,对调用此未知文件格式的程序进行反汇编跟踪调试了。当然,有时灵感和运气也很重要。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------

    from:https://www.cnblogs.com/glegoo/archive/2012/09/28/2707851.html

    位图文件大小的精准计算方法

       8位(bit)位图:彩色版中有2^8=256种颜色,具体哪256种颜色可由调色板灵活规定,因此每个像素点最多有256种情况(颜色),故刚好可用两位十六进制码(16^2=256)表示,占1字节。

    一幅512×512的8位位图大小计算方法:位图文件头(14字节00000000h开始到0000000Dh)+位图信息头(40字节0000000Eh开始到00000035h)+调色板(256×彩色表4字节 00000036h开始到00000435h)+实际像素点占内存(512×512×1字节)=263 222字节(Byte)。

          24位位图:又名RGB真彩色图,含2^24=16 777 216=16M色,没有彩色表,原因上文已说明。每个像素点由3个字节(十六进制码6位)表示,每个字节负责控制一种颜色,分别为蓝(Blue)、绿(Green)、红(Red)。为什么每种颜色用1个字节控制呢?我们知道,图像中任何颜色都是由蓝、绿、红混合而成,而在24位位图中这三种颜色的跨度(深度)分别为256=2^8,占二进制8bit=1字节,故蓝、绿、红刚好可用1个字节表示。那么每个像素点可能的颜色就有256×256×256=2^24种。

    一幅256×256的24位位图大小计算方法:位图文件头(14字节00000000h开始到0000000Dh)+位图信息头(40字节0000000Eh开始到00000035h)+实际像素点占内存(256×256×3字节)=196 662字节(Byte)。    

    需要注意的是,Windows有“补零”的习惯!即要求位图的每一行像素所占字节数必须被4整除。若不能倍4整除,则在该位图每一行的十六进制码末尾“补”1至3个字节的“00”

    例如:一幅宽253×高256的24位位图,微软在生成该图为实际文件时,计算每一行像素所占字节=宽253×3字节=759字节,检验其被4除余1,则在每行的十六进制码末尾加1个字节,补“00”,变为760字节。因此我们计算该图大小时应先判断是否“补零”,再得出算法:该图大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存(高256×每行760字节)=194614字节(Byte)。     有趣的是,“补零”只针对位图的宽进行检验,一幅宽256×高253的24位位图,其大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存(高253×每行768字节)=194358字节(Byte)< 196 662字节(Byte)。这样,只是把此图像的宽和高颠倒,图像所占内存竟然变小了。

    展开全文
  • [转]BMP图像格式分析

    千次阅读 2007-09-06 17:32:00
    BMP图像格式分析 BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且 Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也...
  • 5.1.3 分析BMP图像文件结构(3) 图5-8所示cat2.bmp的调色板颜色和图5-6中的十六进制数据是一一对应的。在Adobe Photoshop CS的调色板上单击任何一个像素的颜色即可弹出一个拾色对话框显示该像素颜色的详细组成...
  • akamai web 指纹注册分析 1.初始化 aj_type,aj_index = 0,0 其中不包含其他 2.注册 aj_type,aj_index= 9,1 获取abck,包含 ~-x-x-x-x 格式 3.解析~x-x-x格式后进行指纹注册 4.注册后mock鼠标或者motion事件多次后可...
  • bmp/gif/jpg图象最底层原理分析

    千次阅读 2012-08-27 18:37:51
    bmp/gif/jpg图象最底层原理分析(1)---- JPG   《探索图像文件的奥秘》,清华大学出版社,1996年   写在前面的  ***********************************...
  • 第一次接触ffmpeg,可以算是hello world程序。...但是解决了,保存bmp图像时,图像颠倒和色彩异常问题。   // x_ffmpeg.cpp : Defines the entry point for the console application. // #include "stdafx.h" #incl
  • 春鹏图片格式分析器

    2012-02-08 15:17:56
    利用此软件可以对常用的图片文件格式进行分析。 对于bmp格式,能够分析出文件头、文件...此软件集bmp文件格式分析器、png文件格式分析器、gif文件格式分析器、jpeg/jpg文件格式分析器于一身。是图片格式学习的利器。
  • 该频谱分析仪可对内部信号(包括LabVIEW产生的基本信号和函数信号、磁盘中的.WAV音频信号)及外部信号(包括声音信号、信号发生产生波形)进行频谱分析,对运行的结果以波形形式显示,并以.BMP图形保存在磁盘中,...
  • bmp 文件详解

    2021-04-16 11:11:23
    BMP文件存储结构的格式可以在Windows中的WINGDI.h文件中找到定义。 BMP文件总体上由4部分组成,分别是位图文件头、位图信息头、调色板和图像数据,如表5-1所示。 表5-1 BMP文件的组成结构 位图文件头(bitmap-...
  • BMP文件结构

    千次阅读 2018-06-23 16:00:04
    BMP(全称Bitmap)是Window操作系统中的标准图像文件格式可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所...
  • 【转】分析BMP图像文件结构(1)

    千次阅读 2012-09-16 20:55:15
    在未得到原作者的同意下转载,特地在此贴出源地址以作声明:http://wmnmtm.blog.163.com/blog/static/3824571420106235522774/ ...结合上面对BMP文件的分析,下面分别对256色和24位色的BMP图像
  • 1、图片码流分析工具 1.1 JPEG: JPEGsnoop https://www.impulseadventure.com/photo/ https://github.com/ImpulseAdventure/JPEGsnoop https://jpegsnoop.en.softonic.com/ 1.2 PNG: tweakpng https://tweak...
  • BMP格式详解

    2021-08-21 23:15:11
    //BMP信息头 typedef __packed struct { uint32_t biSize ; //BITMAPINFOHEADER结构所需要的字数。 long biWidth ; //图象的宽度,以象素为单位 long biHeight ; //图象的高度,以象素为单位 uint16...
  • 图像视频质量分析仪

    千次阅读 2018-12-24 15:23:39
    Video Clarity用于实时或离线采集、输出以及分析、测试完全未压缩的数字音视频质量,实现视音频编解码、视音频处理板卡以及诸如地面电视、有线电视、卫星电视、IPTV、机顶盒等数字电视传输服务的图像质量评价测试...
  • 【转】分析BMP图像文件结构(3)

    千次阅读 2012-09-16 21:05:05
    在未得到原作者的同意下转载,特地在此贴出源地址以作声明:http://wmnmtm.blog.163.com/blog/static/38245714201062355350952/ -----------------------...图5-8所示cat2.bmp的调色板颜色和图5-6中的十六进制数据
  • 第一次接触ffmpeg,可以算是hello ...但是解决了,保存bmp图像时,图像颠倒和色彩异常问题。   [cpp] view plaincopyprint? // x_ffmpeg.cpp : Defines the entry point for the console appl
  • bmp文件格式

    2013-04-13 17:10:25
    BMP文件存储结构的格式可以在Windows中的WINGDI.h文件中找到定义。 BMP文件总体上由4部分组成,分别是位图文件头、位图信息头、调色板和图像数据,如表5-1所示。 表5-1 BMP文件的组成结构 位图文件头...
  • BMP文件介绍

    2015-02-03 10:16:38
    BMP文件具体介绍
  • BMP文件格式探索

    千次阅读 2014-09-28 20:49:58
    BMP: 典型的BMP图像文件由四部分组成: 1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息; 2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息; 3:调色板,这个...
  • BMP图像详解

    千次阅读 2018-07-18 10:38:11
    结合上面对BMP文件的分析,下面分别对256色和24位色的BMP图像进行十六进制分析,通过在十六进制编辑分析文件结构,能够增加分析文件 的经验。 如图5-1和图5-2所示,分别为256色BMP图像cat2.bmp和24位色BMP图像...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,795
精华内容 7,118
关键字:

bmp分析器