天津网站建设诺亚,一流的品牌网站建设,长沙网站排名优化价格,网站制作时如何分析竞争对手5.1 BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式#xff0c;BMP图像文件起源早#xff0c;程序员对BMP都比较熟悉#xff0c;再加上BMP格式简单#xff0c;读取和写入非常容易实现#xff0c;所以无论Windows的还是Driect X#xff0c;都有支持读取… 5.1 BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式BMP图像文件起源早程序员对BMP都比较熟悉再加上BMP格式简单读取和写入非常容易实现所以无论Windows的还是Driect X都有支持读取和写入BMP文件格式的API函数。 针对BMP压缩的算法比较成熟压缩效果也不差而且都是无损压缩编码即可以100%还原BMP图像质量。 虽然JPG格式压缩效果比较理想但游戏编程人员一般极少使用因为JPG要牺牲图像的质量来换取大的压缩率加上JPG解码速度较慢和格式复杂所以游戏中使用JPG格式的图像的情况不多笔者目前只发现一款网络游戏使用JPG格式作为游戏里的图像格式并且使用额外的数据保存了图像中的透明通道信息来让JPG支持透明色。GIF格式虽然支持多帧动画效果但GIF最大仅支持256色不能表达色彩丰富的图像所以对于对速度要求非常苛刻而且图像质量要高的游戏来说使用BMP格式存储图像是不错的选择。 5.1.1 BMP图像文件介绍 BMP图像文件格式是微软公司发明的BMP图像文件的后缀名通常是.BMP但也有少数是.DIP。不过单凭文件的后缀名并不能惟一确定是不是BMP图像文件要惟一确定BMP图像文件还需要分析文件的存储格式。 BMP图像文件和GIF图像文件不同BMP图像文件只能存储一幅图像即一帧。GIF图像文件能保存多帧图像从而可以实现动画的效果。 BMP图像文件支持单色、16色、256色和真彩色4种颜色的图像。BMP图像的数据即可压缩也可以不压缩如果选择了压缩数据那么根据颜色的不同BMP使用不同的RLE压缩方式。 RLE是一种无损压缩方法使用RLE压缩的数据能完整还原。如果图像是16色则可以采用RLE4压缩如果图像是256色则可以采用RLE8压缩真彩色的图像不使用压缩。 BMP的图像数据排列方式有点特别BMP的图像数据排列方式首先从图像的左下角第一个像素开始存储每一行数据即BMP图像数据存储的最后一个像素等于实际图像的右上角第一个像素。 5.1.2 BMP图像文件存储结构1 BMP文件存储结构的格式可以在Windows中的WINGDI.h文件中找到定义。 BMP文件总体上由4部分组成分别是位图文件头、位图信息头、调色板和图像数据如表5-1所示。 表5-1 BMP文件的组成结构 位图文件头bitmap-file header 位图信息头bitmap-information header 彩色表/调色板color table 位图数据bitmap-data 下面来详细看一下每个组成部分的细节。 1位图文件头bitmap-file header 位图文件头bitmap-file header包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段。 打开WINGDI.h文件搜索BITMAPFILEHEADER就可以定位到BMP文件的位图文件头的数据结构定义。 typedef struct tagBITMAPFILEHEADER {WORD bfType;DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER; 表5-2列出了tagBITMAPFILEHEADER中各字段的含义。 表5-2 tagBITMAPFILEHEADER结构 字 段 名 大小单位字节 描 述 bfType 2 位图类别根据不同的操作 系统而不同在Windows 中此字段的值总为‘BM’ bfSize 4 BMP图像文件的大小 bfReserved1 2 总为0 bfReserved2 2 总为0 bfOffBits 4 BMP图像数据的地址 2位图信息头bitmap-information header 位图信息头bitmap-information header包含了位图信息头的大小、图像的宽高、图像的色深、压缩说明图像数据的大小和其他一些参数。 打开WINGDI.h文件搜索tagBITMAPINFOHEADER就可以定位到BMP文件的位图信息头的数据结构定义。 typedef struct tagBITMAPINFOHEADER{DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER; 表5-3列出了tagBITMAPFILEHEADER中各字段的含义。 表5-3 tagBITMAPFILEHEADER结构 字 段 名 大小 单位 字节 描 述 biSize 4 本结构的大小根据不同的操作系统而不同在Windows中此字段的值总为28h字节40字节 biWidth 4 BMP图像的宽度单位像素 biHeight 4 总为0 biPlanes 2 总为0 biBitCount 2 BMP图像的色深即一个像素用多少位表示常见有1、4、8、16、24和32分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色 biCompression 4 压缩方式0表示不压缩1表示RLE8压缩2表示RLE4压缩3表示每个像素值由指定的掩码决定 biSizeImage 4 BMP图像数据大小必须是4的倍数图像数据大小不是4的倍数时用0填充补足 biXPelsPerMeter 4 水平分辨率单位像素/m biYPelsPerMeter 4 垂直分辨率单位像素/m biClrUsed 4 BMP图像使用的颜色0表示使用全部颜色对于256色位图来说此值为100h256 biClrImportant 4 重要的颜色数此值为0时所有颜色都重要对于使用调色板的BMP图像来说当显卡不能够显示所有颜色时此值将辅助驱动程序显示颜色 5.1.2 BMP图像文件存储结构2 3彩色表/调色板color table 彩色表/调色板color table是单色、16色和256色图像文件所特有的相对应的调色板大小是2、16和256调色板以4字节为单位每4个字节存放一个颜色值图像的数据是指向调色板的索引。 可以将调色板想象成一个数组每个数组元素的大小为4字节假设有一256色的BMP图像的调色板数据为 调色板[0]黑、调色板[1]白、调色板[2]红、调色板[3]蓝…调色板[255]黄图像数据01 00 02 FF表示调用调色板[1]、调色板[0]、调色板[2]和调色板[255]中的数据来显示图像颜色。 在早期的计算机中显卡相对比较落后不一定能保证显示所有颜色所以在调色板中的颜色数据应尽可能将图像中主要的颜色按顺序排列在前面位图信息头的biClrImportant字段指出了有多少种颜色是重要的。 每个调色板的大小为4字节按蓝、绿、红存储一个颜色值。 打开WINGDI.h文件搜索tagRGBTRIPLE就可以定位到BMP文件的调色板的数据结构定义。 typedef struct tagRGBQUAD {BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;} RGBQUAD; 表5-4列出了tagRGBTRIPLE中各字段的含义。 表5-4 tagRGBTRIPLE结构 字 段 名 大小单位字节 描 述 rgbBlue 1 蓝色值 rgbGreen 1 绿色值 rgbRed 1 红色值 rgbReserved 1 保留总为0 4位图数据bitmap-data 如果图像是单色、16色和256色则紧跟着调色板的是位图数据位图数据是指向调色板的索引序号。 如果位图是16位、24位和32位色则图像文件中不保留调色板即不存在调色板图像的颜色直接在位图数据中给出。 16位图像使用2字节保存颜色值常见有两种格式5位红5位绿5位蓝和5位红6位绿5位蓝即555格式和565格式。555格式只使用了15位最后一位保留设为0。 24位图像使用3字节保存颜色值每一个字节代表一种颜色按红、绿、蓝排列。 32位图像使用4字节保存颜色值每一个字节代表一种颜色除了原来的红、绿、蓝还有Alpha通道即透明色。 如果图像带有调色板则位图数据可以根据需要选择压缩与不压缩如果选择压缩则根据BMP图像是16色或256色采用RLE4或RLE8压缩算法压缩。 RLE4是压缩16色图像数据的RLE4采用表5-5所示方式压缩数据。 表5-5 RLE4压缩方法 方案 1字节 2字节 3字节 4字节 N字节 A 重复次数 颜色索引 B 设为0 后面有效的 颜色索引数 颜色索引 颜色索引 颜色索引… 假设有如下16色位图数据共20字节数据使用了RLE4压缩 05 00 04 05 00 08 09 05 04 00 04 05 08 09 04 08 07 01 00 00 数据解压时首先读取05因为05不等于0所以选择A方案根据A方案05表示后面数据重复的次数接着读取0000表示有两个颜色索引每个索引占4位第一个像素在高4位第二个像素在低4位即在一个字节中低像素在高位高像素在低位。05 00解压后等于00 00 0。 读取04选择A方案按照上面的操作解析04是后面数据重复的次数05是两个颜色索引第3个颜色索引为5第4个颜色索引为0。04 05解压后等于05 05。 读取00选择B方案读取0808表示后面有效的颜色索引数。00 08解压后等于09 05 04 00。 读取04选择A方案按照上面的操作解析04是后面数据重复的次数05是两个颜色索引。04 05解压后等于05 05。 读取08选择A方案按照上面的操作解析08是后面数据重复的次数09是两个颜色索引。08 09解压后等于09 09 09 09。读取04选择A方案按照上面的操作解析04是后面数据重复的次数08是两个颜色索引。04 08解压后等于08 08。 读取07选择A方案按照上面的操作解析07是后面数据重复的次数01是两个颜色索引。07 01解压后等于01 01 01 0。 读取00选择B方案读取0000表示后面有效的颜色索引数0表示无即解压完一行数据。 综合上面的操作解压后的数据为 00 00 00 50 50 90 50 40 00 50 50 90 90 90 90 80 80 10 10 10 看上去和原来的数据大小一样没有体现到压缩效果这是因为上面的例子只选择了20字节数据而且这20字节数据中重复的数据不多使用RLE压缩重复数据不多的数据时有时可能压缩后的大小反而比原来的数据还大。其实一般情况下当数据比较多而且重复的时候使用RLE压缩效果还是比较理想的。 RLE8的压缩方式可以参考上面的RLE4解压方法惟一的区别是RLE8使用1个字节存放颜色索引而RLE4使用4位存放颜色索引。 5.1.3 分析BMP图像文件结构1 结合上面对BMP文件的分析下面分别对256色和24位色的BMP图像进行十六进制分析通过在十六进制编辑器中分析文件结构能够增加分析文件的经验。 如图5-1和图5-2所示分别为256色BMP图像cat2.bmp和24位色BMP图像cat1.bmp。其中cat2.bmp图像的分辨率为200×153文件大小为31 680字节。cat1.bmp图像的分辨率为200×150文件大小为90 056字节。 图5-1 cat2.bmp图像 图5-2 cat1.bmp图像 现在来分析cat2.bmp的图像文件在Winhex中打开cat2.bmp如图5-3所示。 图5-3 在Winhex中打开cat2.bmp图像文件 首先分析位图文件头的结构如图5-4所示。根据BMP文件的位图文件头结构定义分析出cat2.bmp图像的位图文件头中各字段的含义如表5-6所示。 图5-4 cat2.bmp图像文件的位图文件头 表5-6 cat2.bmp图像文件中位图文件头各字段的含义 十六进制值 描 述 42 4D BM的ASCII值在Windows中的BMP文件标识符 C0 7B 00 00 7B C0h31680是cat2文件的大小 00 00 00 00 保留值总为0 36 04 00 436h1078是图像数据的地址即文件头信息头调色板的长度 5.1.3 分析BMP图像文件结构2 继续分析接下来的数据根据BMP文件结构的定义接下来的数据是位图信息头cat2.bmp图像文件的位图信息头的内容如图5-5所示。 图5-5 cat2.bmp图像的位图信息头 表5-7所示为cat2.bmp图像文件中位图信息头各字段的含义。 表5-7 cat2.bmp图像文件中位图信息头各字段的含义 十六进制值 描 述 28 00 00 00 cat2.bmp图像的位图信息头大小 C8 00 00 00 00 00 00 C8 200是cat2图像的宽度单位像素 99 00 00 00 00 00 00 99 153是cat2图像的高度单位像素 01 00 总是1 08 00 00 08 8cat2图像的色深即2的8次幂等于256色 00 00 00 00 压缩方式0表示不压缩 8A 77 00 00 00 00 77 8A 30602是cat2图像的图像数据大小单位字节 12 0B 00 00 00 00 0B 12 2834cat2图像的水平分辨率单位像素/m 12 0B 00 00 00 00 0B 12 2834cat2图像的垂直 分辨率单位像素/m 00 00 00 00 cat2图像使用的颜色数0表示使用全部颜色 00 00 00 00 cat2图像中重要的颜色数0表示所有颜色都重要 继续分析接下来的数据根据BMP文件结构的定义因为cat2.bmp图像是256色的位图所以应该有256个调色板每个调色板占4字节整个调色板一共1024字节大小。 cat2.bmp图像文件的调色板数据如图5-6和图5-7所示 图5-6 cat2.bmp图像的调色板地址从00000036h开始存储 图5-7 cat2.bmp图像的调色板数据结束地址是00000435h 从图5-6和图5-7中可以看出cat2.bmp图像的调色板地址从00000036h开始到00000435h结束即00000435h - 00000036h 1 400h 1024。 如果想查看cat2图像的调色板对应的实际显示颜色可以使用Adobe Photoshop CS打开cat2.bmp在Adobe Photoshop CS的菜单栏中选择图像→模式→颜色表即可观看cat2的调色板如图5-8所示。 图5-8 在Adobe Photoshop CS中查看cat2的调色板 5.1.3 分析BMP图像文件结构3 图5-8所示cat2.bmp的调色板颜色和图5-6中的十六进制数据是一一对应的。在Adobe Photoshop CS的调色板上单击任何一个像素的颜色即可弹出一个拾色器对话框显示该像素颜色的详细组成信息。cat2.bmp调色板和cat2.bmp的十六进制数据的对应关系如图5-9所示。 继续分析接下来的数据根据BMP文件结构的定义如果一个图像有调色板那么紧跟在调色板后面的是图像的数据这些数据不是实际的颜色值而是指向调色板数组的索引根据索引来获取调色板中的颜色如图5-10所示。 点击查看大图图5-9 cat2.bmp调色板和cat2.bmp的十六进制数据的对应关系 点击查看大图图5-10 cat2.bmp的图像数据 因为cat2.bmp是256色的位图即采用了8位色深作为指向调色板数组的索引所以根据图5-10中显示的数据可以得知49 49 49 B1 49 49 49 49 49 99表示cat2.bmp位图左下角第1个像素的颜色等于调色板[49]第2个像素的颜色等于调色板[49] 第3个像素的颜色等于调色板[49] 第4个像素的颜色等于调色板[B1]……依此类推。分析完cat2.bmp图像之后接下来分析的是cat1.bmp。 cat1.bmp图像是24位色图像根据BMP文件结构定义得知cat1.bmp图像没有调色板图像数据存储的是实际的颜色数据每个像素用3字节表示分别是红绿蓝。由于cat1.bmp和cat2.bmp的位图文件头和位图信息头结构一样所以cat1.bmp的位图文件头和位图信息头可以参考上面对cat2.bmp的分析下面从cat1.bmp的位图信息头结束的位置开始分析如图5-11所示。 点击查看大图图5-11 cat1.bmp图像的图像数据 从图5-11可以看到表示每个像素的红绿蓝三色的值实际存放的时候是倒过来存放的在分析BMP图像格式时需要注意这点。 通过上面对BMP文件存储结构的分析发现BMP文件的位图文件头和位图信息头存在着大量的重复数据。如果存储大量同一色深的BMP位图必然会浪费大量存储空间所以很多时候游戏编程人员都会去掉BMP文件头和信息头只保留几个必要的信息和图像数据那么BMP文件头和信息头中哪几个字段是必须保留的呢 使用Winhex的文件比较功能比较两个24位色深的BMP图像文件观察两个文件的文件头和信息头有什么不同的地方如图5-12所示。 点击查看大图图5-12 使用Winhex比较两个24位色深的BMP图像文件 从图5-12可以看出两个色深相同的BMP图像的文件头和信息头一共有4处不同的地方分别是文件头的文件大小、信息头的图像宽度、图像高度和图像数据大小。 所以很多时候游戏编程人员只保留图像文件的文件大小、图像宽度、图像高度和图像数据大小信息甚至有时不需要保留文件大小这个数值使用图像数据大小数值即可。 在分析未知文件存储格式时如果遇到去掉了文件头的文件时如上面所说的BMP文件会给分析未知文件格式带来一定的困难。这时需要使用十六进制编辑器的文件比较功能观察两个同类的未知文件格式寻找某些潜在的规律如果实在观察不出规律的那只能使用白盒分析方法对调用此未知文件格式的程序进行反汇编跟踪调试了。当然有时灵感和运气也很重要。 原文地址http://book.51cto.com/art/200903/112705.htm