其实一年多之前写过一篇类似的文章,用的是之前的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。
写得比较笼统,具体的只要用十六进制编辑器打开一个具体的文件就能弄明白了。