340 likes | 457 Views
介绍. BMP 图形结构. 2011 年 10 月 3 日. 内容. BMP 文件结构 文件头信息块 图像描述信息块 颜色表 图像数据区 BMP 文件结构定义 BMP 文件结构实例. BMP 文件结构. 概述 BMP 取自位图 B it M a P 的缩写,也称为 DIB (与设备无关的位图)是微软 windows 图形子系统( Graphics Device Interface )内部使用的一种位图图形格式,它是微软 windows 平台上的一个简单的图形文件格式。
E N D
介绍 BMP图形结构 2011年10月3日
内容 • BMP文件结构 • 文件头信息块 • 图像描述信息块 • 颜色表 • 图像数据区 • BMP文件结构定义 • BMP文件结构实例
BMP文件结构 • 概述 • BMP取自位图BitMaP的缩写,也称为DIB(与设备无关的位图)是微软windows图形子系统(Graphics Device Interface)内部使用的一种位图图形格式,它是微软windows平台上的一个简单的图形文件格式。 • 图像通常保存的颜色深度有2(1位)、16(4位)、256(8位)、65536(16位)和1670万(24位)种颜色(其中位是表示每点(dot)所用的数据位)。8位图像可以是索引彩色图像外,也可以是灰阶图像。
BMP文件结构 存储算法 • BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。 • 例如,一个800×600的24位bmp格式图片占据800*600*24bit/8=800*600*3字节空间?答案是错误的! • 因此它们通常不适合在因特网或者其他低速或者有容量限制的媒介上进行传输。 • n位2n种颜色的包含调色板的位图近似字节数可以用下面的公式计算: • BMP文件大小 • 其中高度(height)和宽度(width)都以像素为单位。 调色板,n位有2^n种颜色,每种颜色4B,分别表示R、G、B和无实质含义第4字节 文件头占54字节(固定) 显示位图信息
BMP文件结构 位图头 • 这部分是识别信息,典型的应用程序会首先普通读取这部分数据以确保的确是位图文件并且没有损坏。 • 字节 #0-1 保存位图文件的标识符,这两个字节的典型数据是BM。 • 字节 #2-5 使用一个dword保存位图文件大小。 • 字节 #6-9 是保留部分,留做以后的扩展使用,对实际的解码格式没有影响。 • 字节 #10-13 保存位图数据位置的地址偏移,也就是起始地址。
BMP文件结构 位图信息 • 这部分告诉应用程序图像的详细信息,在屏幕上显示图像将会使用这些信息,它从文件的第15个字节开始。 • 字节 #14-17 定义以下用来描述影像的区块(BitmapInfoHeader)的大小。它的值是:40 - Windows 3.2、95、NT、12 - OS/2 1.x、240 - OS/2 2.x • 字节 #18-21 (0x12-0x15)保存位图宽度(以像素个数表示)。 • 字节 #22-25(0x16-0x19) 保存位图高度(以像素个数表示)。 • 字节 #26-27(0x1a-0x1b) 保存所用彩色位面的个数。不经常使用。 • 字节 #28-29 (0x1c-0x1d)保存每个像素的位数,它是图像的颜色深度。常用值是1、4、8(灰阶)和24(彩色)。 • 字节 #30-33 定义所用的压缩算法。允许的值是0、1、2、3、4、5。
BMP文件结构 位图信息 • 然而,由于大多数位图文件都是不压缩的,所以最常用的值是0。 • 字节 #34-37 保存图像大小。这是原始(:en:raw)位图数据的大小,不要与文件大小混淆。 • 字节 #38-41 保存图像水平方向分辨率。 • 字节 #42-45 保存图像竖值方向分辨率。 • 字节 #46-49 保存所用颜色数目。 • 字节 #50-53 保存所用重要颜色数目。当每个颜色都重要时这个值与颜色数目相等。
BMP文件结构 调色板 • 这部分定义了图像中所用的颜色。如上所述,位图图像一个像素接着一个像素储存,每个像素使用一个或者多个字节的值表示,所以调色板的目的就是要告诉应用程序这些值所对应的实际颜色。 • 典型的位图文件使用RGB彩色模型。在这种模型中,每种颜色都是由不同强度(从0到最大强度)的红色(R)、绿色(G)和蓝色(B)组成的,也就是说,每种颜色都可以使用红色、绿色和蓝色的值所定义。 • 在位图文件的实现中,调色板可以包含很多条目,条目个数就是图像中所使用的颜色的个数。每个条目包含4个字节:其中三个表示红色、绿色和蓝色,第四个字节没有使用(大多数应用程序将它设为0)。对于每个字节,数值0表示相应的颜色在当前的图像文件中没有使用,而数值255表示那个颜色使用最大的强度。
BMP文件结构 位图数据 • 这部分逐个像素表示图像。像素是从下到上、从左到右保存的。每个像素使用一个或者多个字节表示。如果一个图像水平线的字节数不是4的倍数,这行就使用空字节补齐,通常是ASCII码0。 • 范例: 有一张5*5的图片,应该会有25个pixels,但是因为5不是4的倍数所以会显示成: xxxxx000 xxxxx000 xxxxx000 xxxxx000 xxxxx000 • x代表调色盘的编号 0代表Null_character • 有一张4*4的图片,应该会有16个pixels,但是因为是4的倍数所以会显示成: • xxxx xxxx xxxx xxxx
BMP文件结构定义 • 第一部分:位图文件头BITMAPFILEHEADER,是一个结构,其定义如下: • typedef unsigned char BYTE • typedef unsigned short WORD • typedef unsigned long DWORD • typedef struct tagBITMAPFILEHEADER { WORD bmptype; //图片类型,必须是0x424D,即字符串“BM”, DWORD bmplength; //图片信息字节数 WORD bmpReserved1; //保留字 WORD bmpReserved2; //保留字 DWORD distance; //实际位图数据的偏移字节数,即前三个部分长度之和 }BITMAPFILEHEADER;
第二部分:图像描述信息块BITMAPINFOHEADER,也是一个结构,其定义如下:第二部分:图像描述信息块BITMAPINFOHEADER,也是一个结构,其定义如下: • typedef struct tagBITMAPINFOHEADER { DWORD Size; //指定此结构体的长度 LONG bw; //图片宽度 LONG bh; //图片高度 WORD biplanes; //平面数 WORD bibitcount; //采用颜色位数 DWORD bicompression; //压缩方式 DWORD bisize; //实际位图数据占用的字节数 LONG cbiXPelsPerMeter; //X方向分辨率 LONG biYPelsPerMeter; //Y方向分辨率 DWORD biClrUsed; //使用的颜色数 DWORD biClrImportant; //重要颜色数 }BITMAPINFOHEADER;
第三部分:调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。第三部分:调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。 • typedef struct RGB { BYTE rgbBlue; //该颜色的蓝色分量 BYTE rgbGreen; //该颜色的绿色分量 BYTE rgbRed; //该颜色的红色分量 BYTE rgbReserved; //保留值 }RGBQUAD;
第四部分:实际的图像数据。对于用到调色板的位图,图像数据就是该像素在调色板中的索引值。第四部分:实际的图像数据。对于用到调色板的位图,图像数据就是该像素在调色板中的索引值。 • 对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。 • 对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素。 • 对于256色位图,一个字节可以表示1个像素。 • 对于真彩色图,三个字节才能表示1个像素。 • 注意,一般来说,BMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图像最下面一行的左边第一个像素,然后是左边第二个像素,接下来是倒数第二行左边第一个像素,左边第二个像素,依次类推,最后得到的是最上面一行的最右一个像素。
字节 #30-33 定义所用的压缩算法 0 - 没有压缩(也用BI_RGB表示) 1 - 行程长度编码8位/像素(也用BI_RLE8表示) 2 - 行程长度编码4位/像素(也用BI_RLE4表示) 3 - Bit field(也用BI_BITFIELDS表示) 4 - JPEG图像(也用BI_JPEG表示) 5 - PNG图像(也用BI_PNG表示) 这里是00 00 00 00,含义是没有压缩 BMP文件结构 文件头信息块 位图数据位置的地址偏移 :从00 00 00 36地址开始是位图数据 00 00 00 F6文件大小(数据截止到上述地址结束) 0x0E处的值为0x28,说明它是windows系统下的位图 00 00 00 28 字节 #18-21 保存位图宽度(以像素个数表示)。 00 00 00 08表示宽8像素 字节 #22-25 保存位图高度(以像素个数表示)。 00 00 00 08表示高度8像素 字节 #28-29 保存每个像素的位数,它是图像的颜色深度。常用值是1、4、8(灰阶)和24(彩色)。 这里的00 18是16进制,16+8=24位色 字节 #26-27 保存所用彩色位面的个数。不经常使用。 00 01表示彩色位平面1个 8*8的24位色黑白相间方格,BM的ACSII码 • 这部分是识别信息,典型的应用程序会首先普通读取这部分数据以确保的确是位图文件并且没有损坏。 • 字节 #0-1 保存位图文件的标识符,这两个字节的典型数据是BM。 • 字节 #2-5 使用一个dword保存位图文件大小。 • 字节 #6-9 是保留部分,留做以后的扩展使用,对实际的解码格式没有影响。 • 字节 #10-13 保存位图数据位置的地址偏移,也就是起始地址。 地址6-9:保留 位图数据区
8*8 4位色BMP(配色表16项) 字节 #2-5 使用一个dword保存位图文件大小 地址96文件结束
8*8 4位色BMP(配色表16项) 字节 #6-9 是保留部分,留做以后的扩展使用,对实际的解码格式没有影响
8*8 4位色BMP(配色表16项) 地址0a-0d 保存位图数据位置的地址偏移,也就是起始地址 从00 00 00 76开始是数据
8*8 4位色BMP(配色表16项) 地址0e-0x11 定义以下用来描述影像的区块(BitmapInfoHeader)的大小。 大小为00 00 00 28
8*8 4位色BMP(配色表16项) 地址0x12-0x15字节 保存位图宽度(以像素个数表示)。 00 00 00 08说明宽度为8
8*8 4位色BMP(配色表16项) 地址0x16-0x19字节 保存位图高度(以像素个数表示)。 00 00 00 08说明高度为8
8*8 4位色BMP(配色表16项) 地址0x1a-0x1b字节保存所用彩色位面的个数 。 00 01说明彩色位面的个数为1
8*8 4位色BMP(配色表16项) 地址0x1c-0x1d字节保存每个像素的位数 。 00 04说明每个像素的位数为4 (16色),下面配色表有16项,每项4字节。
8*8 4位色BMP(配色表16项) 地址0x1e-0x21字节定义所用的压缩算法 。 0 - 没有压缩
8*8 4位色BMP(配色表16项) 地址0x22-0x25字节保存图像大小 。 00 00 00 20 0x96-0x76=0x20
8*8 4位色BMP(配色表16项) 地址0x26-0x29字节保存图像水平方向分辨率 。 0x00000b12=2834
8*8 4位色BMP(配色表16项) 地址0x2a-0x2d字节保存图像垂直方向分辨率 。 0x00000b12=2834
8*8 4位色BMP(配色表16项) 地址0x2e-0x31字节保存所用颜色数目 。 0
8*8 4位色BMP(配色表16项) 地址0x32-0x35字节保存所用重要颜色数目 。 0
8*8 4位色BMP(配色表16项) 从0x36开始 0#色 R=00 G=00 B=00 黑色 0x36=B 0x37=G 0x38=r 0x39:nc R在高地址! 数据中没有0 所以本例此处是什么无关紧要,本例中数值全是9,仅仅9的配色表有意义。
8*8 4位色BMP(配色表16项) 1#色 R=00 G=00 B=80 淡蓝
8*8 4位色BMP(配色表16项) 9#色 R=ff G=00 B=80 红色! 显示红色快
8*8 4位色BMP(配色表16项) 问题:1、将数据全改成00,还要显示8*8红色块,是否可以,配色表怎么变化? 2、有一张5*5的图片,应该会有25个pixels, 数据区有多少数据? 3、arm采用的256色采用332方案,对应的配色表是什么?