关于DNF的多媒体包NPK文件的那些事儿(3) - IMGV2
IMGV2
1.????介紹
IMGV2是IMG文件結構的第二個版本,廣泛用于DNF中大部分的貼圖文件,所有的UI(按鈕、對話框、廣告圖片、loading畫面、地下城選擇框等等)、圖標(比如裝備、裝扮、消耗品、地面物品)、標志(比如物品品級框、傷害數字、裝備鎖等等)、稱號貼圖都使用IMGV2。
在2016年之前,幾乎所有DNF貼圖都是IMGV2格式(少數是IMGV1格式),在那之后,時裝貼圖被IMGV4代替,技能特效貼圖也逐漸被IMGV5代替。對現在的版本,IMGV2的時裝和技能特效基本見不到了,但是IMGV2版本的補丁依然是生效的。
IMGV2的特點是可以兼容任意復雜的貼圖,易于點陣操作;但圖像數據塊所占空間大,讀取速度較慢。
2.????結構
IMGV2的結構如下表所示:
| 文件頭 | 20字節字符串(注意空格)“Neople Img File ” | |||||||||||||||||||||||||
| 索引表大小 | 4字節,索引表所占空間。 | |||||||||||||||||||||||||
| 保留 | 4字節,為0。 | |||||||||||||||||||||||||
| 版本號 | 4字節,IMGV2文件結構中的版本號為2。 | |||||||||||||||||||||||||
| 索引表數目 | 4字節,索引表的表項(包括指向型和圖片型) | |||||||||||||||||||||||||
| 索引表 | 索引表項1 | 由若干個索引項構成。索引項包括2種,指向型和圖片型。圖片型存儲對應圖片的各種信息,指向型只存儲一個數據,即所指向的圖片的幀號。 ?
? ? | ||||||||||||||||||||||||
| 索引表項2 | ||||||||||||||||||||||||||
| 索引表項3 | ||||||||||||||||||||||||||
| 索引表項4 | ||||||||||||||||||||||||||
| …… | ||||||||||||||||||||||||||
| 貼圖數據 | 圖像數據塊1 | 由首尾相接的圖像數據塊構成。 由于大部分圖像數據由ZLIB進行壓縮,因此經常以“0x78 0x9C”數據開頭(但不可以其為標準作為圖像數據塊的起始點)。 指向型索引項不對應任何圖像數據(即對應的圖像數據大小為0)。 | ||||||||||||||||||||||||
| 圖像數據塊2 | ||||||||||||||||||||||||||
| 圖像數據塊3 | ||||||||||||||||||||||||||
| …… | ||||||||||||||||||||||||||
3.????圖像數據
關于ZLIB壓縮的貼圖數據,可以使用ZLIB官方提供的庫來進行解壓縮,網上有很多ZLIB的使用教程(編譯和使用),我們一般只使用兩個函數 compress(壓縮)和uncompress(解壓),都是簡單的對字節流進行操作,這里不在贅述。ZLIB官方地址:http://www.zlib.net/。代碼是完全開源和免費的。
?????? 對于IMGV2來說,以“0x78、0x9C”開頭的數據解壓出的數據就是對應的像素點陣數據,可以根據顏色系統來分解成對應的像素顏色數據,然后根據圖像索引項內的寬和高(高其實沒啥必要)來使其二維化。
4.????關于圖像讀取與指向幀
在系統讀取(提取)所需要的貼圖時,一般都先指定所要提取圖片的幀號。所謂幀號就是IMG文件內圖像按索引表順序存放的一個有序序號。第一幀(第一個貼圖)就是0號幀,第二幀就是1號幀,以此類推。
系統在通過幀號提取圖片時,若幀號索引項是圖片索引項,就會根據在此之前的圖片索引項內圖像數據大小來跳過特定的數據,從而找到對應圖片索引項的圖片數據的起點。然后根據圖片索引項內的圖像數據大小來提取出整個圖像數據塊,然后對這個圖像數據塊進行解壓(如果需要的話),通過顏色系統轉換成點陣數據,就可以直接顯示了。
若幀號索引項是指向型索引項(也就是指向幀),則系統通過該索引項的第二字節,也就是指向幀號來尋找對應的索引項,倘若對應的索引項依然是指向型索引項,則會繼續尋找下去,直到找到圖像索引項為止,然后根據上述的過程提取對應的圖片。
當多個幀號指向同一圖片時,指向型索引項允許其不需要存儲相同的數據,因此極大地節省了IMG文件的空間。但是,這也產生了一個問題,即指向型索引項有可能像鏈表那樣,指向型索引項指向了一個無意義或者并不存在的索引項(例如指向-1);或者甚至地,產生有向閉環結構,最簡單的情形就是指向型索引項指向自己。前者會使界面產生紅X,甚至導致嚴重的貼圖錯誤;后者則更嚴重,使得系統不斷地嘗試進行貼圖讀取,進而使游戲直接崩潰(因而也有些人用EX制作整人補丁,比如深淵一出SS讀取史詩特效的時候就游戲崩潰)。因此在使用指向型索引項的時候,最好能避免其指向其他的指向型索引項。
5.????增加一個貼圖的流程
增加一個貼圖,需要修改3個內容:首先,是文件開頭的索引表數目和索引表大小要增加;其次,索引表的里面的指定幀號對應的位置要添加出新的圖片數據的索引項;最后,根據指定幀號和對應位置在圖像數據塊中間插入目標圖片數據(當然,要使用ZLIB進行壓縮)。
值得注意的是,不像NPK內的IMG索引表,由于IMG內的圖像索引表內沒有存儲偏移量數據,所以在對單個的IMG數據進行增加貼圖操作時,幾乎除了這三個部分之外都不需要改動,但如果使用的用于存儲圖像數據系列的數據結構(這些數據結構一般是EX開發人員自定義的)內部含有偏移量數據,最好重新讀取IMG以修正這些變量。
總結
以上是生活随笔為你收集整理的关于DNF的多媒体包NPK文件的那些事儿(3) - IMGV2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 10g 白皮书,Oracl
- 下一篇: pyqt 界面关闭信号_木辛老师的编程课