1. 程式人生 > >我用 Python 擼了一個 plist 圖集拆圖工具!附上github原始碼

我用 Python 擼了一個 plist 圖集拆圖工具!附上github原始碼

這些年,我一直在使用 JavaScript 、CocosCreator 做開發,只要是他們不能解決的,我都不太願意去弄,或者說是不太情願去做。真的是手中有把錘子,看什麼都是釘子,越是熟悉一樣東西,越容易被**思維定式**給束縛,難以成長! 前段時間,我在嘗試學習 Python,想用來做點什麼,一直沒想好。我必須得學以致用才行,不然過兩天又忘記了。 但這次機會來了! 前兩天,有位老朋友找到我,尋求 Cocos 圖集的**裁圖工具**,我順手給了一個 Windows 版本的 PngSplit.exe,我曾經用過多次感覺還行! ![image-20201101234056094](https://img2020.cnblogs.com/other/1755688/202011/1755688-20201104163013970-1440267791.png) > 小知識:初學的夥伴可能還不清楚,什麼是**圖集**? > > 圖集通常是使用 TexturePacker 這個工具,將多張小的碎圖合併,匯出生成一個 png 檔案與同名的 plist 檔案。 > > ![image-20201101232111490](https://img2020.cnblogs.com/other/1755688/202011/1755688-20201104163014617-1063772846.png) > > 遊戲引擎通過解析 plist 檔案,獲取對應 png 圖片上的子圖,還原碎圖。通過圖集可以減少檔案體積,提高檔案載入速度,更重要的是他能減少 Drawall 提升渲染效率! 但,我剛給了朋友後,想到如果是 Cocos 格式的圖集是有 plist 檔案的,通過 plist 可以完美換原之前的碎圖。但使用 PngSplit 拆分一些有透明畫素的幀動畫圖片就不行了! ![](https://img2020.cnblogs.com/other/1755688/202011/1755688-20201104163015272-1027199278.png) 匯出的子圖周邊沒有透明,並不是還原碎圖最原始的樣子,這樣生成的資源,要重新制作動畫難度非常之大! 想到這裡,有點點興奮,我拿起 Python 開幹!程式碼大概分成兩大部分: 1. 解析 plist 檔案,解析出子圖在圖集中的矩形位置 2. 通過分析出的子圖矩形資料,將子圖紋理匯出生成影象 大的思維有了,解析 plist 應該是有對應的工具庫的,我也是 Python 小白*面向百度程式設計*絕對是不能不掌握的技巧 輸入:**python3 plist 解析** ![image-20201102085405911](https://img2020.cnblogs.com/other/1755688/202011/1755688-20201104163015865-1638099276.png) 出來的大部分是用 plistlib 這個庫,而且是 Python 自帶的!非常好,第一個問題有解了,先不管細節,再看第二個問題! 我在百度上搜索:**python3 圖片處理** ![image-20201102085806645](https://img2020.cnblogs.com/other/1755688/202011/1755688-20201104163016656-1017542747.png) 有一個名為 PIL 的庫顯示的最多,簡單瞭解一下: >python image library 影象庫,處理影象功能,該庫提供了廣泛的檔案格式支援,如JPEG、PNG、GIF、等,它提供了影象檔案、影象顯示、影象處理等功能。 > >注意安裝時,使用的是:`pip install pillow` 大概花了半個小時,簡單瞭解了一下 PIL 的功能,其中的 Image 模組正是我需要的 : ```python # 從當前影象返回矩形區域的副本 # box是一個4元祖,定義從左、上、右、下的畫素座標 Image.crop(box) ``` 有了大概的瞭解,就開始真正的動手了。剛開始真的很不習慣,經常範錯,比如:定義變數加 var;每麼末尾加分號;if () 用括號;基礎資料型別的屬性方法記不住...... 好兩次我想放棄了,明明知道怎麼做,就是弄不好,語法出錯,執行出錯!最氣人的是,我寫出的程式碼,到處是波浪線,我用的是 PyCharm 這個神器級別的IDE。 我堅持完成了第一個版本,也就 50 行程式碼,拆分的圖片不帶透明區,因為我只會使用`Image.crop` 這個函式,剩下的我還不會。 休息了兩天,再次撿起來,我又找到兩個 Image 物件上的方法: ```python # 翻轉、旋轉影象 image = image.transpose(Image.ROTATE_90) # 將image影象貼上base影象中 # box引數我給的是偏移2元組 base.paste(image, (offset_x, offset_y)) ``` 功能搞定生成圖片非常完美,還原了 plist 中的檔名、原始大小、透明區域偏移,整個程式碼加上註釋也不到100行。 最後,我還研究了一下 Python 的程式碼規範,與 JS、TS 完全不是一個門派,變數名、函式名都是用小寫,程式碼之間用下劃線隔開,感覺是回到了讀書時用的 C 語言,終於整個程式碼清爽起來了: ![image-20201102094643923](https://img2020.cnblogs.com/other/1755688/202011/1755688-20201104163017014-409604774.png) 雖然東拼西湊將功能實現了,但我總覺得怪怪的,第一次用 Python 做個開源小工具求大神們指點,有那些可以改進的地方,也希望這個工具指令碼能幫助到大家! 程式碼下載:https://github.com/ShawnZhang2015/tp-png-split >更多精彩請關注[Creator星球遊戲開發社群](https://mp.weixin.qq.com/mp/homepage?__biz=MzA5MjEwOTI4Ng==&hid=1&sn=4a3615fc758895afe067f69cb