位图文件(BMP)

 
位图文件
简介
 
BMPBitmapFile)格式是最常用的图像文件存取格式之一,是微软为其Windows环境设置的标准图像格式,BMP位图文件默认的文件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。用BMP格式存放的图像几乎可以被所有的图像显示软件读取。
BMP图形文件是Windows采用的图像文件格式,在Windows环境下运行的所有图像软件都支持BMP图像文件格式。Windows系统内部个图像绘制操作都是以BMP为基础的。Windows3.0以前的BMP文件格式与显示设备有关,因此把这种BMP图像文件格式称为设备相关位图(Device Dependent Bitmap,DDB)文件格式。Windows3.0以后的BMP文件都与显示设备无关,因此把这种BMP文件格式称为设备无关位图(Device Independent Bitmap,DIB)格式。
 
BMP文件格式
摘要
 
         每个BMP文件只能存放一张图像。图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理是BMP图像文件的一个选项,用户可以根据需要进行选择。
         其中,非压缩格式是BMP图像文件所采用的一种通用格式,它按照一定的顺序忠实的记录图像中每一个像素的颜色值。如果用户确定将BMP文件格式压缩处理,则Windows设计了一种压缩方式:如果位图为16色模式,则采用RLE4压缩方式,如果图像为256色模式,则采用RLE8压缩方式。
         BMP图像数据文件格式可以存储为单色,16色,256色和真彩色四种图像数据,其数据的排列顺序与一般文件不同,它以图像的左下角作为起点存储图像,而不是以图像的坐上角为起点。而且BMP图像文件格式中还存在另外一个与众不同的特点,即其调色板数据所采用的数据结构中,红,绿,蓝三种基色数据的排列顺序也恰好与其他图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境的新特色,而且随着Windows版本的不断更新,微软也在不断的改进BMP图像文件格式。
 
BMP中包含的域
 
BMP位图文件是由四个部分组成:位图文件头(bitmap-file header,位图信息头(bitmap-information header,调色板(color table)和定义位图的字节阵列(图像数据阵列)。其对应的结构体或类型分别为:BITMAPFILEHEADER,BITMAPINFOHEADER,RGBQUAD,BYTE
1.   位图文件头
位图文件头BITMAPFILEHEADER
偏移
域的名称
长度/字节
内容
0000h0
bfType
2
两字节的内容用来识别位图的类型,存储的是两个字符的ASCII码。
BM(0x4D42):Windows
BA/CT/CP/IC/PT: OS/2
0002h2
bfSize
4
整个文件的大小
0006h6
bfReserved1
2
保留未用,必须为0
0008h8
bfReserved2
2
保留未用,必须为0
000Ah10
bfOffBits
4
从文件开头到图像数据开始之间的字节数,有了该数据能方便地跳过位图的信息头
 
 
2.   位图信息头BITMAPINFOHEADER
 
偏移
域的名称
长度/字节
内容
000Eh14
biSize
4
文件信息头的长度
40(28h)Windows
00012h18
biWidth
4
位图的宽度,以像素为单位
00016h22
biHeight
4
位图的高度,以像素为点为
001Ah26
Biplanes
2
位图的为平面数(该值总是为1
001Ch28
biBitCount
2
每个像素的位平面数,有下面几种情况:
1:单色位图
416色位图
8256色位图
1616bit高彩色位图
2424bit真彩色位图
3232bit增强型真彩色位图
001Eh30
biCompression
4
压缩说明:
0:不压缩(BI_RGB表示)
1RLE8,使用8RLE压缩方式(用BI_RLE8表示)
2RLE4,使用4RLE压缩方式(用BI_RLE4表示)
3Bitfields:位域存放方式(用BI_BITFIELDS表示)
0022h34
biSizeImage
4
位图数据的大小,以字节为单位。该数必须是4的倍数。当图像存储的是非压缩数据的时候,它的取值可以为0,实际上,此时位图数据的大小可以通过biBitCountbiWidthbiHeight等计算出来
0026h38
biXPelsPerMeter
4
用像素/米表示的水平分辨率
002Ah42
biYPelsPerMeter
4
用像素/米表示的垂直分辨率
002Eh46
biClrUsed
4
位图使用的颜色数,如果为0则表示使用了全部可能的颜色
0032h50
biClrImportant
4
指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
 
3.   调色板
 
调色板又叫彩色映像表,使用每个像素为14或者8为的图像必须有一个调色板,相对应的调色板的大小分别为216或者256个表项。如果图像没有使用相对应的全部颜色,则调色板仅记录使用过的颜色,此时调色板会小一些。也就是说,如果位图信息头中的biClrUsed字段非零,则它记录的是使用的颜色数目,同时它也是彩色映像的表项号码。若该字段为0则彩色映像为全大小,也就是说色深为148的图像,调色板分别具有216256个表项。
对于16为和24为的图像,没有调色板,图像是直接RGB彩色,此时biClrUsed字段不为0,以提供一个建议的调色板大小,不过并没有多少实际意义。
由于显示设备可能不具备图像所需的那么多的颜色,因此彩色映像中的表项在排列顺序应该是最重要的颜色排在前面。位图信息头中的biClrImportant字段如果不为0,则指出了对于好的图像重新生成多少种颜色是重要的
彩色映像表RGBQUAD结构定义:
偏移
域的名称
长度/字节
内容
0
rgbBlue
1
调色板项的蓝色值
1
rgbGreen
1
调色板项的绿色值
2
rgbRed
1
调色板项的红色值
3
rgbReserved
1
保留未用,必须为0
 
4.   图像数据阵列
 
紧跟在调色板之后的是图像数据阵列,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可以是实际的RGB值。
图像的每一扫描行由表示图像像素的连续的字节组成,每一个扫描行对应的字节数取决于图像的色深和图像的宽度。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位于左下角的像素,而最后一个字节表示位图右上角的像素。
图像数据中的阵列可以是压缩的,也可以是不压缩的:每个像素可以用一位表示,也可以用32位表示,这些都是由前面讲过相关字段决定。下面分别说明不同色深的位图中图像数据阵列到底是如何排列的。
(1)         色深1位的位图
每个像素只用一位表示,每个字节可以表示8个像素,字节中的最高位对应于最左边的像素。
(2)         色深4位的位图
对没有压缩的图像,每个字节可以表示2个像素,高4位为左边的像素,且每行填充到一个4字节的边界上。
(3)         色深8位的位图
 
对没有压缩的图像,每个字节表示一个像素。每行填充到4字节边界。
(4)         色深24位的位图
 
每个像素用3个字节表示,顺序依次为红,绿和蓝的值。每行用0填充到4字节的边界。
原文地址:https://www.cnblogs.com/mywolrd/p/1930731.html