五千年(敝帚自珍)

主题:初到贵宝地,灌一点游戏开发的东东 -- foundera

共:💬23 🌺4
全看分页树展 · 主题 跟帖
家园 解拆《傲世三国》的图形文件

解拆《傲世三国》的图形文件 出 处:程序人生

  《傲世三国》的图片资源都按555与565格式分别存放在555与565两个目录下,图片都是以资源的形式存放在DLL中的,因此我们可以很方便的导出这些资源。粗略的观察了一下这些文件,发现许多都是以xbm开头的,可以肯定这些是图片文件无疑。从观察的结果看,所有这些图片都有一个64byte的文件头。下面我选用了555\res02.dll中的30450资源来进一步观察。文件头如下:

  78 62 6D 00 00 00 00 00 00 00 00 00 00 00 00 00

  00 00 00 00 5A 00 00 00 50 00 00 00 10 0F 01 00

  1F 7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  根据我的经验推测,文件头的数据结构大体是这样的:

  struct FILE_HEAD {

    BYTE ID[20];    // 图片文件标识="xbm..."

    DWORD Width,Height; // 定义图片的宽和高

    DWORD ColorMode;   // 这个值在555时为10f10,在565时为11010,推测应该是定义颜色模式的

    DWORD MaskColor;   // 定义透明色的值

    DWORD AlphaChannel; // 当图片带Alpha通道时,该值为1。

    DWORD ImageOffset;  // 当图片带Alpha通道时,该值为图片数据在文件中的偏移量。

    BYTE Reserved[20]; // 暂时还没有发现这些值被使用

  }

  接下来的数据:

  40 01 00 00 42 01 00 00 44 01 00 00 46 01 00 00

  48 01 00 00 4A 01 00 00 4C 01 00 00 4E 01 00 00

  50 01 00 00 52 01 00 00 54 01 00 00 56 01 00 00

  58 01 00 00 5A 01 00 00 5C 01 00 00 5E 01 00 00

           …… ……

  这些数据排列很有规律,一共80个,应该不是图像数据,明眼人一看便知,这些是每一行图像数据在文件中的偏移量,当读入内存的时候这些值就会被加上图像数据的首地址,从而成为指向每一行图像数据的指针。这些对我们解图片用处不大,解的时候可以跳过这些数据。接下来是真正的图像数据:

  B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00

  B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00

  B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00

  B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00 B4 00

  B4 00 B4 00 B4 00 22 00 06 00 6A 35 8A 35 49 31

  2C 00 0A 00 25 31 E9 51 C9 4D 67 3D C3 20 56 00

           …… ……

  从刚才的偏移量数据看出,每行的数据量都不相同,可以肯定是压缩的数据。根据我的经验判断,这些图片使用了最简单的只压缩透明色的RLE压缩算法。这个算法对于我们来说是很熟悉的,早在很多年以前(写闪电战机的时候)我就开始使用了,下面简单介绍一下。

  第一个WORD数据0xB4,表示连续透明点的长度是180(怎么是180?哦,应该再除2才对),所以应该画90个透明像素点(注意:图片宽度也是90,因此第一行就已经画完了),接着转下一行,又是0xB4,接着转下一行……。下面看这行数据:

  2200 0600 6A35 8A35 4931 2C00 0A00 2531 E951 C94D 673D C320 5600

  0x22表示画17个透明像素点,0x6表示画3个像素点,像素数据跟在后面0x356A、0x358A、0x3149,接着再是透明点、像素点……直到一行画满为止。至此,这类图片格式就全部解拆完了,。

  下面,我们再来看看带Alpha通道的图片格式,这类格式和前面一种差不多,只不过在文件头后面插入了一个Alpha通道,Alpha通道的数据是不压缩的,每个点为一个Byte宽度,因此,只要跳过Width*Height的数据就和上面的处理方法一样了。

  由于时间有限,暂时我就只发现了这两种图片格式,可能还有其他没有被发现的图片格式,就靠大家去发现了。所有的数据结构也只是本人主观臆测,未必正确。另外程序我也写出来了,但是我不打算拿出来了,一来考虑到版权保护的问题,二来是想锻炼一下各位的动手能力,如果你有兴趣的话,看了上面的介绍,应该很容易写出解图片的程序。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河