本帖最后由 paulhyde 于 2014-9-15 09:20 编辑
bmp图片由3大部分组成:BITMAPFILEHEADER结构体,BITMAPINFO结构体,DIB数据区。其中DIB意思就是 Device-Independent Bitmap(设备无关位图)。两个结构体的定义如下:(注意Integer类型占2个字节,Long类型占4个字节) BITMAPINFO结构体中还有两个子结构体,分别定义如下: 文件的大小个、第4个、&H0000文件中的位置偏移量
BITMAPINFO结构体部分。BITMAPINFO段由两部分组成:BITMAPINFOHEADER结构体和RGBQUAD结构体。其中RGBQUAD结构体表示图片的颜色信息,有些时候可以省略,一般的24位图片和32位图片都不带RGBQUAD结构体,因为DIB数据区直接表示的RGB值,一般4位图片和8位图片才带有RGBQUAD结构体。(多少位的图片就是用多少位来表示一个颜色信息,例如4位图片表示用4个bit来表示一个颜色信息。)一个bmp文件中有没有RGBQUAD结构体,可以根据前面BITMAPFILEHEADER结构体的第5个属性bfOffBits来判断,因为BITMAPINFOHEADER结构体长度为40bit,如果BITMAPINFOHEADER结构体结束后还未到DIB数据区的偏移量,就说明接下来的数据是RGBQUAD结构体部分。这里讲的C:\WINDOWS\Blue Lace 16.bmp是一个4bit图片,所以它带有 RGBQUAD结构体。 图片的宽度
图片的高度1图片的颜色位数图片数据区的大小X轴每米多少像素Y轴每米多少像素
DIB数据区的偏移量,所以接下来的部分是RGBQUAD结构体。RGBQUAD结构体由4个字节型数据RGBQUAD结构体只占用4字节空间,从左到右每个字节依次表示(蓝色,绿色,红色,未使用)。举例的这个图片我数了数总共有16个RGBQUAD结构体,由于该图片是4位图,2^4正好等于16,所以它把16种颜色全部都枚举出来了,这些颜色就是一个颜色索引表。颜色索引表编号从0开始,总共16个颜色0-15。从UltraEdit中可以看到按照顺序,这16个RGBQUAD结构体依次为: (蓝,绿,红,空) 号:(00,00,00,00) 号:(00,00,80,00) 号:(00,80,00,00) 号:(00,80,80,00) 号:(80,00,00,00) 号:(80,00,80,00) 号:(80,80,00,00) 号:(80,80,80,00) 号:(C0C0,C0,00) 号:(00,00,FF,00) 号:(00,FF,00,00) 号:(00,FF,FF,00) 号:(FF,00,00,00) 号:(FF,00,FF,00) 号:(FF,FF,00,00) 号:(FF,FF,FF,00) 4表示索引表中第5个颜色
bmp图片就全部解析完了,根据这些信息就可以完整的绘制一张bmp图片来。偏移量找到DIB数据区,装入一个buffer中保存BITMAPINFO结构体也有了,直接用CopyMemory复制过来,然后就可以调用CreateDIBSection函数创建一个hBitMap出来,把这个hBitMap选入DC中,就可以用BitBlt或StretchBlt向目标DC中复制数据,把bmp图片就在绘图区显示出来了。
文件组成 文件由文件头、位图信息头、颜色信息和图形数据四部分组成。 文件头 文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
位图文件的类型,必须为BM位图文件的大小,以字节为单位位图文件保留字,必须为0位图文件保留字,必须为0位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
位图信息头数据用于说明位图的尺寸等信息。本结构所占用字节数位图的宽度,以像素为单位位图的高度,以像素为单位目标设备的级别,必须为1每个像素所需的位数,必须是1(双色),色),8(256色)或24(真彩色)之一位图压缩类型,必须是 0(不压缩),压缩类型)或2(BI_RLE4压缩类型)之一位图的大小,以字节为单位位图水平分辨率,每米像素数位图垂直分辨率,每米像素数位图实际使用的颜色表中的颜色数位图显示过程中重要的颜色数
蓝色的亮度(值范围为0-255)绿色的亮度(值范围为0-255)红色的亮度(值范围为0-255)保留,必须为0RGBQUAD结构数据的个数有biBitCount来确定:biBitCount=1,4,8时,分别有2,16,256个表项;biBitCount=24时,没有颜色表项。BITMAPINFO结构定义如下:位图信息头颜色表位图数据 ,扫描行之间是从下到上。位图的一个像素值所占的字节数:
|