现在的位置: 首页 > 综合 > 正文

Mng和Png

2013年10月10日 ⁄ 综合 ⁄ 共 1365字 ⁄ 字号 评论关闭

  研究某社的游戏,里面用到了mng格式的文件。

 

  mng是用来杀掉gif的格式,但现在还不流行,不过表现力的确不错。XnView可以直接打开,但是支持得还不完美。能编辑mng的软件实在是少,很多只能输出成mng格式的文件。修图反应使用PNG MNG Construction Set编辑,导入后游戏崩溃。我估计肯定是里面放了什么信息,编辑后被丢掉了。

 

  我找来这个软件想看一下丢了点什么东西,居然完全不知道怎么编辑。- -b。又找了不少软件,里面最有希望的是GIMP,但是不知道什么原因,file-mng.exe总是报错。据说Linux版本就没有问题。最后还是放弃了,老老实实地研究mng和png的格式。不过同样,这个研究有很强的目的性,所以我只分析该游戏中出现的chunk类型和chunk组合方式,很不完整。 好,废话说到这里。

 

  这些文件的资料都可以到libpng.org上面去找,libmng的源码也可以下载一份。

 

  首先mng或者是png一开头都是8-byte的签名,之后就是一串chunk,chunk的格式都是通用的,4-byte的data size,4-byte的chunk name,之后就是chunk data,最后是4-byte的CRC。要注意的是,data size是高位在前的,使用的时候要交换一下。

 

  对一个最简单的png来说,签名之后的chunk就这么三种,IHDR,IDAT * n,IEND,I是Image的意思。IHDR里面定义一下宽、高、色深之类的东西。IDAT就是数据了,不过我观察下来,用PS编辑之后如果不选择“交叉保存”,不会出现多个IDAT块,而是一个大块就了结。多个IDAT块这种结构我估计是为了网络显示图片时由模糊到清晰而设计的。

 

  如果用到调色板,那么就会有一个PLTE chunk。具体如何对我意义不大,只要在IDAT之前加上去就可以了。

 

  下面看mng,首先是一个MHDR,那么结尾也就是MEND。MHDR里面不少属性,不一一介绍了。之后一般有一个FRAM,因为mng是动画,所以有帧的概念。FRAM的属性中有一个是Name,我怀疑游戏使用这个Name来定位。当然,一个mng也可能没有FRAM,那么就是静态的图片了。

 

  FRAM的属性麻烦一些,主要是有省略的现象,这个仔细看下文档就行,这里只是提一下。

 

  FRAM之后有几个可选的chunk,比如DEFI,DEFI是用来定义一个Object,这里可以指定图片的left和top等属性,一般第一张图是背景,就没有DEFI,之后的图会有DEFI。

 

  不管有没有DEFI,之后最主要的部分还是IHDR/IDAT/IEND,这就是一张图,在IHDR之后也有一些可选项,除了刚才说的PLTE,还有tEXt,tEXt的功能很简单就是放一个Keyword,一个/0和一个value,keyword中主要的就是Title,我估计游戏也根据这个查找图片,扔掉的chunk很可能就是这个。

 

  一个FRAM中可以有多张图,也就是多个IHDR/IDAT/IEND组。

 

  那么拆mng也很简单,就是找到IHDR/IDAT/IEND,前面加个png的签名写进文件就可以。封mng的话,就是IHDR/IDAT/IEND/PLTE以外的chunk用原始mng的,这四个用png的。

抱歉!评论已关闭.