铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 9203|回复: 8

[通用] 浅谈《金庸群侠传》的图片压缩格式【chaoliu】

 关闭 [复制链接]
发表于 2006-5-19 12:41 | 显示全部楼层

浅谈《金庸群侠传》的图片压缩格式【chaoliu】

本帖最后由 weyl 于 2014-3-10 22:40 编辑

■浅谈《金庸群侠传》的图片压缩格式 作者:chaoliu

  图片查看器是我2001年做的Qb小程序,曾发布到一些游戏编程站点共同学习,后来有网友来信要源程序,应要求我把程序上传并提供下载。当时我并不明白它是什么格式,只到不久前才搜索到RLE压缩资料,其实原理很简单。最近在冰蓝论坛遇到许多和我一样的游戏编程爱好者,共同讨论,我才体会到靠一人的力量进展太慢了,现在把发过的文章重新修改补充,虽然只是基础知识,但希望能启发更多和我一样刚起步的爱好编程的朋友,图片查看器源代码一并附上。
  金庸群侠传是95年的DOS游戏,因其开放性的游戏模式而经久不衰,同时它的数据结构很规范、有条理,作为学习研究也是很好的素材。下面是我分析的过程。

辅助工具:金庸群侠传图片查看器
文件列表:
1.所有人物头像 hdgrp.grp hdgrp.idx
2.所有武功效果 eft.grp eft.idx
3.所有武功动作 fight???.grp fight???.idx
4.所有场景地图块 fmap.grp fmap.idx
5.所有外景地图块 mmap.grp mmap.idx
6.云 cloud.grp cloud.idx
7.片尾动画 kend.grp kend.idx
8.制作群信息 endword.grp endword.idx
9.256色调色板 mmap.col

在这里我用图片来说明图像压缩数据的格式
1.游戏中的图像都是采用了位图的RLE8压缩算法:
Run-Length Encoding
持续编码器/行程长度编码
一种压缩算法,用单字节代替顺序重复字节及重复长度。
  用十六进制编辑器打开一个图像文件(*.grp)看看就有规律的修改图像的一个点,再进一次游戏看看图像的变化,多试几试到几十次就能发现其中的奥妙了。

2.游戏中的MMAP.COL就是256色调色板,按照B-G-R来存放颜色数据。每个索引颜色值占3字节,文件共3*256=768字节

看看下面的图像,读取该图像需要调用hdgrp.grp和hdgrp.idx两个文件

分析一下hdgrp.idx,460个字节,内部每4个字节为一个地址,用于存放每幅头像在hdgrp.grp中的结束位置,所以共有460/4=115幅头像;用jyshow.exe查看头像,右边的提示为:page:0/115,这说明分析是对的。
用HEX编辑器查到hdgrp.idx的前4个字节为4F 0B 00 00,实际是十六进制的B4F,这说明hdgrp.grp文件的前B4F个字节存放的是主角(第一幅为徐小侠,人物代号为0)的头像数据。
剪切hdgrp.grp文件的前B4F个字节,另存为新文件,用debug调试它,得到输出为:

-d 100 c4f
1289:0100 38 00 3A 00 00 00 39 00-1C 0F 1A 81 81 71 71 72 8.:...9......qqr
1289:0110 72 72 8B 8B 8C 8C 72 72-72 72 72 72 72 72 72 72 rr....rrrrrrrrrr
1289:0120 72 72 72 72 72 23 0C 21-81 81 81 70 71 71 72 72 rrrrr#.!...pqqrr
1289:0130 8C 8B 8C 8C 71 71 80 80-80 80 80 72 72 72 72 72 ....qq.....rrrrr
1289:0140 72 72 72 72 70 70 70 80-80 29 09 27 81 81 81 70 rrrrppp..).'...p
1289:0150 70 70 71 71 72 8C 8C 8C-8C 71 71 71 80 80 80 80 ppqqr....qqq....
1289:0160 80 80 70 70 70 70 72 72-72 72 70 70 70 70 70 70 ..pppprrrrpppppp
1289:0170 70 70 70 2C 07 2A 81 81-70 72 72 72 70 71 71 72 ppp,.*..prrrpqqr
1289:0180 8D 8D 8D 71 71 71 80 80-80 80 80 70 70 70 70 70 ...qqq.....ppppp
1289:0190 70 70 70 72 72 72 70 70-70 70 70 70 70 6F 6F 70 ppprrrpppppppoop
1289:01A0 30 04 03 81 81 81 02 29-72 72 72 70 6F 71 72 8E 0......)rrrpoqr.
1289:01B0 8E 8D 71 71 80 80 80 70-70 6F 6F 6F 70 70 70 70 ..qq...ppooopppp
1289:01C0 70 70 70 70 72 72 70 70-70 70 70 70 70 6F 6F 6F pppprrpppppppooo
1289:01D0 70 34 00 04 81 81 81 81-03 2C 70 70 70 70 6F 70 p4.......,ppppop
1289:01E0 70 71 71 8E 8E 71 80 80-80 70 6F 6F 6F 70 70 70 pqq..q...poooppp
1289:01F0 70 70 70 6F 6F 6F 6E 6E-70 70 70 70 70 70 70 70 pppooonnpppppppp
1289:0200 ... ...(这里只列出256字节输出结果)
-q
好了,不要觉得麻烦,现在我们来分析这段数据。
刚才说hdgrp.idx前4个字节是B4F,也就是说徐小侠的头像占了0到B4F个字节;用debug得到的十六进制稍有变化,是0100到0C4F,总之也是B4F个字节。
我们来取一段数据看看,
1289:0100 38 00 3A 00 00 00 39 00-1C 0F 1A 81 81 71 71 72 8.:...9......qqr
1289:0110 72 72 8B 8B 8C 8C 72 72-72 72 72 72 72 72 72 72 rr....rrrrrrrrrr
1289:0120 72 72 72 72 72 23 0C 21-81 81 81 70 71 71 72 72 rrrrr#.!...pqqrr
1289:0130 8C 8B 8C 8C 71 71 80 80-80 80 80 72 72 72 72 72 ....qq.....rrrrr
1289:0140 72 72 72 72 70 70 70 80-80 29 09 27 81 81 81 70 rrrrppp..).'...p

首先来分析这段,1289:0100 38 00 3A 00 00 00 39 00;把38和3A这两个十六进制数转为十进制,得到56和58;而用jyshow.exe看图的时候右边提示width:56/height:58(宽56像素,高58像素),当然这两个数就是头像的宽和高了。【补充:之后的4个字节表示图像贴图时的偏移,这里为00 00 39 00,即十进制的0和57,表示在x轴贴图偏移0像素,在y轴偏移57像素】

再来分析蓝色这段(实际上就是头像的第一行共56个点的颜色数据),1C转为十进制就是28,那么数一数蓝色的数字有多少个?正好28个!所以1C就表示图像第一行数据占用的字节数。
再来看看0F(十进制的15),数数徐小侠头顶的一行,左起一共15个点是无色的,所以0F表示该行颜色的连续透明像素的个数。
再来看看1A(十进制的26),表示接下来有26个点有颜色了,自己看图数一数吧。1A后边的26个数字当然就是26个像素的颜色索引值。
现在注意,蓝色的数据(第1行像素)已结束,还剩下15个透明的点已不需要表示出来了。
得到结论:第一行的颜色(蓝色数据)可分为4部分
a.本行颜色共用多少个字节表示(1C/28),占用1字节
b.本行开头有多少个透明像素(0F/15),占用1字节
c.接下来有多少个非透明像素(1A/26),占用1字节
d.然后用1A/26个字节来表示非透明的颜色值,占用a-1-1(28-1-1)个字节
好了,请参考下面的图像再分析验证一下。



只要弄懂了一行数据的存储方法,RLE压缩的秘密也就被揭穿了!思路明了,要想编程调用游戏图片就难不倒你。
接来下再提醒一点,注意徐小侠头像的第5行!一缕头发隔开,使该行图像分成了
4个透明点-3个颜色点-2个透明点-47个颜色点
已经不需要再多说了,下面就是第五行图像的数据,根据提示自己去分析吧!
1289:01A0 30 04 03 81 81 81 02 29-72 72 72 70 6F 71 72 8E 0......)rrrpoqr.
1289:01B0 8E 8D 71 71 80 80 80 70-70 6F 6F 6F 70 70 70 70 ..qq...ppooopppp
1289:01C0 70 70 70 70 72 72 70 70-70 70 70 70 70 6F 6F 6F pppprrpppppppooo
1289:01D0 70
kend.grp是片尾动画,从idx看来有200多个图片块,用kend.grp文件大小一除,刚好每个大小是64000,正好是320x200,说明kend.grp按照顺序含有200多个320x200未经任何压缩的原始图片,于是从第一个64000字节开始,播放200多次,完成动画。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-3-8 21:16 | 显示全部楼层
编辑器哪下载
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-3-9 08:27 | 显示全部楼层
大大好厉害,我看不懂哦。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-3-10 11:48 | 显示全部楼层
天上有雾..头上下雨.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-3-13 19:36 | 显示全部楼层
不会做

评分

参与人数 1 -10 收起 理由
KG -10 灌水

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-5-9 10:59 | 显示全部楼层
源码在哪里?最好能有达人提供一个操作图片和z.dat的dll,个人觉得这样可能对繁荣金庸mod有很大的好处
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-5-20 13:21 | 显示全部楼层

回复 #3 wolfox 的帖子

我也看不懂哦!~~~~~~~~

评分

参与人数 1 -10 收起 理由
KG -10 灌水

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-5-30 20:17 | 显示全部楼层
支持下,拿分走人!!

评分

参与人数 1 -30 收起 理由
KG -30 灌水

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2007-12-18 20:02 | 显示全部楼层
是看不懂

评分

参与人数 1 -2 收起 理由
lift_viper -2 挖坟+灌水 警告

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-16 13:45

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表