在C# WPF工程中,查看数据格式和内存空间,能够知道Gray16是用 2 bytes来表示一个像素的亮度值,可是保存成 64位BMP后图像数据是怎么组织的呢???
首先,有必要弄清楚 BMP位图格式的存储原理。
将BMP文件用16进制格式(Ultra Edit)打开,逐byte查看文件里面存储的元素值。BMP文件包含位图文件头和位图信息头。
位图文件头一般占 14 bytes,结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
UNIT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
其中:
bfType 说明文件类型,在windows系统中为BM。
bfSize 说明文件大小。
bfReserved1 bfReserved2 保留,设置为0。
bfOffBits 说明实际图形数据的偏移量。
位图信息头一般占 40 bytes,结构定义如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMerer;
LONG biYPelsPerMerer;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER;
其中:
biSize 说明BITMAPINFOHEADER结构所需字节数,在windows系统中为28h
biWidth 说明图像宽度
biHeight 说明图像高度
biPlanes 为目标设备说明位面数,其值设为1
biBitCount 每个像素的位数,单色位图为1,256色为8,24bit为24。
biCompression 压缩说明,BI_RGB:无压缩,BI_RLE8:8位RLE压缩,BI_RLE4:4位RLE压缩
biSizeImage 说明图像大小,如无压缩,可设为0
biXPelsPerMeter 水平分辨率
biYPelsPerMeter 垂直分辨率
biClrUsed 位图使用的颜色数
biImportant 重要颜色数目
下面,以获取的一张图片实例来解释 BMP头文件各个 byte所表示的含义:
用红色框出部分的数据为BMP头文件:
1.位图文件头
0,1:42 4D 为位图的标志。如果转换成 ASCII 码的话就是 BM。
2-5:(00 0E 10 36)H = 921654D(bytes),表示文件大小为921654bytes,也可以通过查看文件大小信息知道。
6-9:(00 00 00 00)H为保留字。
10-13:(00 00 00 36)H = 54D,文件起始位置标志,表示文件从第54位开始。
2.位图信息头
14-17:(00 00 00 28)H = 40D,表示位图信息头的长度,即为40 bytes。
18-21:(00 00 02 80)H = 640D,表示位图宽度,即为640 pixels。
22-25:(00 00 01 E0)H = 480D,表示位图高度,即为480 pixels。存储方式为从最后一行先存,最后存第一行//高度值为负数,则表示存储顺序为从上到下
26-27:(00 01)H,表示设备级别
28-29:(00 18)H = 24D,表示位图色彩级别,即为 24位真彩色。
30-33:(00 00 00 00)H,表示压缩类型,0表示不压缩
34-37:(00 0E 10 00)H = 921600D,位图阵列表字节数,即为921600 bytes。
38-41:(00 00 0B 6D)H,表示水平分辨率
42-45:(00 00 0B 6D)H,表示垂直分辨率
46-49:(00 00 00 00)H,表示位图实际使用的颜色表中的颜色变址。
50-53:(00 00 00 00)H,表示位图显示过程中被认为重要颜色变址数。
3.像素存储组织方式
BMP存储像素值的方式为从下至上,从左至右,紧随着文件头存储的字节为图像最下一行的数值,从左下角开始依次存储。
0C 27 20 36 ... 为图像左下角像素的数值,依次向右存储,最后一行扫描完后,紧接着存储上一行,最后一个byte存储的是图像右上角像素的数值。
可用MATLAB读取BMP图片后对比内存存放方式,就一目了然了。
以上,BMP存储方式讲清楚了。
至于64位的bmp图组织方式,下次补充!