Mng和Png

  研究某社的遊戲,裏面用到了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的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章