其实一年多之前写过一篇类似的文章,用的是之前的CSDN的账号,但是因为当时其实并没有很用心,于是文章中还是有一些小错误。王大理的文章因为年代久远,轻易也找不到了,所以现在重新写一遍WAS文件格式的博客。 直接进入正题,was文件格式应该是王大理第一次提出来的。网易内部应该用的是tcp的扩展名,但是这一点对数据影响不大,其中的编码方式还是相同的。 文件头部分:16个字节。 第1.2字节:文件标志,所有was文件这里都是'SP',如果不是,说明编码有错误。 第3.4字节:文件头部分的长度,这里没有包含前4个字节。对于was或者说tcp文件,这个值应该是12。(注1) 第5.6字节:文件中包含图像的方向数量。 第7.8字节:文件中每个方向包含的图像数量,也就是常说的帧数量。 第9.10字节:图片的总宽度。 第11.12字节:图片的总高度。 第13.14字节:图片的关键点的X坐标。 第15.16字节:图片的关键点的Y坐标。 以上是文件头部分。紧跟着文件头是512个字节的调色板部分。每个颜色占用两个字节,16位,565模式,共有256个颜色。对于图片的绘制,所有颜色都是取自调色板中的定义。 调色板之后是每张图片的起始位置索引。这个索引是从调色板头部作为0值计算的,文件头并没有算在内。这部分的大小是方向数量*每个方向图片数量*4个字节。每个方向的图片索引都在一起。 图片索引之后是每张图片的内容。其中每个图片头部有4个4字节的信息值,分别表示图片的关键点X,关键点Y,图片的宽度,图片的高度。(注2) 之后是每一行像素信息的起始位置索引。这段索引应该是将对应图片数据的开始位置(图片关键点X)作为0值计算。所占用的大小是图片的高度*4个字节。 之后是真正的图片颜色信息,每个单元具体长度取决于数据的内容。 第一个字节中 如果前两个比特为00时,若其余6个比特也为0,则表示该行的图像数据结束(注3),否则表示带有alpha层的像素。(注4) 若第3个比特为1 剩下的5个比特为alpha值 且下一个字节为调色板索引。 若第3个比特为0 则表示将要重复alpha像素,剩下的5个比特为重复的次数。之后的一个字节为alpha值,下一个字节为调色板索引。 第一个字节中 如果前两个比特为01时,则表示普通像素,剩下的5个比特表示数据段的长度。之后的每一个在长度中的字节都表示调色板索引。 第一个字节中 如果前两个比特为10时,表示重复像素,剩下的5个比特为重复的次数,之后的一个字节为调色板索引。 第一个字节中 如果前两个比特位11时,表示跳过像素,剩下的5个比特表示跳过像素的数量。 注1:所有was\tcp文件的前4个字节都是相同的。之所以存在这4个字节,应该是因为网易的素材包WDF文件中并没有文件名这个概念,也就没有扩展名的概念。这4个字节可以将tcp文件和其他类型(如png,mp3格式)文件区分开。 注2:在文件头部已经存在关键点X,Y和图片的规格,在每张图片的头部仍然有这4个元素。具体程序绘制图片的时候应该是这两部分都要参与计算。 注3:作者无法确定是否有某一行结束时,并没有将一行的所有像素点的数据全部给出。 注4:was\tcp文件中的alpha的取值范围是0~31。 写得比较笼统,具体的只要用十六进制编辑器打开一个具体的文件就能弄明白了。
congcongzhidao 发表于 2025-10-10 10:48 其实一年多之前写过一篇类似的文章,用的是之前的CSDN的账号,但是因为当时其实并没有很用心,于是文章中还 ... 嗯嗯,我现在就想研究研究自己打包个TCP文件试试,但是一直失败。从DDS精灵图裁剪成每帧,然后打包进TCP文件,结果生成了TCP但是没内容,不知道哪里出了问题。我估计是颜色,对我来说太有难度了。嘿嘿,感谢您的热心帮助。