图像相似度检测之BMP文件格式

来源:互联网 发布:光纤网络交换机 编辑:程序博客网 时间:2024/05/02 01:28
1. 位图类型(来自msdn)

位图是位的数组,它指定了像素矩阵中各像素的颜色。专用于单个像素的位数决定了可分配到该像素的颜色数。例如,如果用 4 位来呈现每个像素,那么一个给定的像素就可以分配到 16 (2^4 = 16) 种颜色中的一种。下表中的几个示例显示了可分配到由给定位数代表的像素的颜色数量。

每像素的位数

一个像素可分配到的颜色数量

1

2^1 = 2

2

2^2 = 4

4

2^4 = 16

8

2^8 = 256

16

2^16 = 65,536

24

2^24 = 16,777,216

存储位图的磁盘文件通常包含一个或多个信息块,信息块中存储了如每像素位数、每行的像素数以及数组中的行数等信息。这样一个文件也可能包含颜色表(有时称为调色板)。颜色表将位图中的数值映射到特定的颜色。下面的插图显示了一幅放大的图像以及它的位图和颜色表。每个像素用一个 4 位数表示,那么颜色表中有 2^4 = 16 种颜色。表中的每种颜色用一个 24 位数表示:8 位用于红色,8 位用于绿色,8 位用于蓝色。数字以十六进制(基 16)形式显示:A = 10,B = 11,C = 12,D = 13,E = 14,F = 15。

位图示例

请看位于该图像第 3 行、第 5 列的像素。位图中相应的数值为 1。颜色表告诉我们 1 表示红色,所以该像素是红色的。该位图最上面一行中所有的项都是 3。颜色表告知我们 3 表示蓝色,所以该图像最上面一行中的所有像素都是蓝色。

说明:

一些位图是以上下颠倒的格式存储的;位图首行中的数值对应于图像末行中的像素。

在颜色表中存储索引的位图称为“调色板索引位图”。有些位图不需要颜色表。例如,如果位图使用每像素 24 位的格式,那么该位图就可以将颜色本身(而不是索引)存储到颜色表中。下面的插图显示了一个直接存储颜色(24 位/像素)而不使用颜色表的位图。该插图也显示了相应图像的放大视图。在位图中,FFFFFF 表示白色,FF0000 表示红色,00FF00 表示绿色,0000FF 表示蓝色。

位图示例

有许多将位图存储到磁盘文件的标准格式,GDI+ 支持下面段落中所描述的图形文件格式。

BMP 是 Windows 使用的一种标准格式,用于存储设备无关和应用程序无关的图像。一个给定 BMP 文件的每像素位数值(1、4、8、15、24、32 或 64)在文件头中指定。每像素 24 位的 BMP 文件是通用的。BMP 文件通常是不压缩的,因此,不太适合通过 Internet 传输。

2. BMP的结构表示(C语言)

typedef unsigned char uvar8;   typedef unsigned int uvar32;   typedef unsigned short int uvar16;   typedef  struct  { uvar8 Blue; /*蓝色所占比重*/                     uvar8 Green; /*绿色所占比重*/                     uvar8 Red; /*红色所占比重*/uvar8 Reserved;}  Palette;//定义bmp结构 uvar8 bfType[2]; /* 类型标志,总是BM */ /*属于head部分,但是读取时,防止内存补齐机制的影响, 所以单列出来(这块出了错误很难检测出来)*/typedef struct { uvar32 bfSize; /* 文件大小 */ uvar32 bfReserved1; uvar32 bfOffBits; /* 位图点阵偏移量*/ }HEAD; typedef struct { uvar32 biSize; /* 结构体字节总数 */ uvar32 biWidth; /* 图像宽度 */ uvar32 biHeight; /*图像高度 */ uvar16 biPlanes; /* 必须为1 */ uvar16 biBitCount; /* 每个像素所占二进制位数,可能是1,4,8或 24 */ uvar32 biCompress; /*压缩方式*/ uvar32 biSizeImage; /*像素点阵大小 */ uvar32 biXPelsPerMeter; /* 水平像素数*/ uvar32 biYPelsPerMeter; /* 垂直像素数 */ uvar32 biClrUsed; /*使用的颜色数 */ uvar32 biClrImportant; /*重要颜色数 */ }INFO;