在WOF的OPEN BETA客户端里面,我看到很多TGL文件。看同事在玩这个游戏,我觉得画面挺精致的,于是想把它的图像文件解开。
用HEDIT打开一个TGL文件,一开始有个DFX的头标记。跳过一堆很多00的数据之后,我看到了78 9C,再根据游戏目录下的ZLIB的DLL,基本可以确定后面就是压缩过的图像数据。
从78 9C往前看,有两个BYTE[4]的数字,前面的一个比后面的大,而且后面一个等于后面78 9C开头的数据的长度。推断这两个分别是压缩前和压缩后的数据长度。
然后,我就写了个小程序解开了TGL。它里面压缩的图像数据经过检查,是DDS文件,也就是DIRECTX可以使用的一种贴图格式。用DXSDK的贴图工具即可打开。
经过仔细推敲,TGL文件的格式也基本解开,如下所描述
//文件头格式
char[4] sign; //文件标记
int specialflag; //特殊标记(据猜测用来表示后面需要单独指定每帧的显示时间)
int unknown; //未知(据猜测,用来指定后面的SIZE的个数)
struct SIZE{long x; long y;} sizes[4]; //图像大小描述 (据猜测用来指定图像的实际大小,文件大小,开始点和结束点)
int frameCount; //图像帧数
int frameDispalyTime; //据猜测是图像每帧显示时间
struct RECT { long left;long top;long right;long bottom;} rects[frameCount]; //图像的显示RECT(据猜测用来确定每帧图像在实际大小里面的显示RECT)
if( specialflag == 1 ){ int frameDisplayTime[frameCount];} // 如果标记是真,这里就是每帧的单独显示时间(猜测)
根据帧数,后面有帧数个图像块,他们的格式如下:
// 图像块格式
int blockflag; //标记块是否有效,一般为1有效
int originSize; // 图像块的原始大小
int compressedSize; // 图像块的压缩后的大小
byte[compressedSize] data; //图像块压缩数据
用这个格式就可以解出TGL里面的图像了。我为了省力,直接用HGE来进行DDS的显示,做了一个TGL查看器。下面就是程序下载。
/Files/johndragon/tglviewer.zip查看器使用方法:直接将TGL文件拖放到窗口上即可。