這些年,我一直在使用 JavaScript 、CocosCreator 作開發,只要是他們不能解決的,我都不太願意去弄,或者說是不太情願去作。真的是手中有把錘子,看什麼都是釘子,越是熟悉同樣東西,越容易被思惟定式給束縛,難以成長!python
前段時間,我在嘗試學習 Python,想用來作點什麼,一直沒想好。我必須得學以至用才行,否則過兩天又忘記了。git
但此次機會來了!github
前兩天,有位老朋友找到我,尋求 Cocos 圖集的裁圖工具,我順手給了一個 Windows 版本的 PngSplit.exe,我曾經用過屢次感受還行!編程
小知識:初學的夥伴可能還不清楚,什麼是圖集?函數
圖集一般是使用 TexturePacker 這個工具,將多張小的碎圖合併,導出生成一個 png 文件與同名的 plist 文件。工具
遊戲引擎經過解析 plist 文件,獲取對應 png 圖片上的子圖,還原碎圖。經過圖集能夠減小文件體積,提升文件加載速度,更重要的是他能減小 Drawall 提高渲染效率!學習
但,我剛給了朋友後,想到若是是 Cocos 格式的圖集是有 plist 文件的,經過 plist 能夠完美換原以前的碎圖。但使用 PngSplit 拆分一些有透明像素的幀動畫圖片就不行了!動畫
導出的子圖周邊沒有透明,並非還原碎圖最原始的樣子,這樣生成的資源,要從新制做動畫難度很是之大!3d
想到這裏,有點點興奮,我拿起 Python 開幹!代碼大概分紅兩大部分:代碼規範
大的思惟有了,解析 plist 應該是有對應的工具庫的,我也是 Python 小白面向百度編程絕對是不能不掌握的技巧
輸入:python3 plist 解析
出來的大部分是用 plistlib 這個庫,並且是 Python 自帶的!很是好,第一個問題有解了,先無論細節,再看第二個問題!
我在百度上搜索:python3 圖片處理
有一個名爲 PIL 的庫顯示的最多,簡單瞭解一下:
python image library 圖像庫,處理圖像功能,該庫提供了普遍的文件格式支持,如JPEG、PNG、GIF、等,它提供了圖像檔案、圖像顯示、圖像處理等功能。
注意安裝時,使用的是:
pip install pillow
大概花了半個小時,簡單瞭解了一下 PIL 的功能,其中的 Image 模塊正是我須要的 :
# 從當前圖像返回矩形區域的副本 # box是一個4元祖,定義從左、上、右、下的像素座標 Image.crop(box)
有了大概的瞭解,就開始真正的動手了。剛開始真的很不習慣,常常範錯,好比:定義變量加 var;每麼末尾加分號;if () 用括號;基礎數據類型的屬性方法記不住...... 好兩次我想放棄了,明明知道怎麼作,就是弄很差,語法出錯,運行出錯!最氣人的是,我寫出的代碼,處處是波浪線,我用的是 PyCharm 這個神器級別的IDE。
我堅持完成了第一個版本,也就 50 行代碼,拆分的圖片不帶透明區,由於我只會使用Image.crop
這個函數,剩下的我還不會。
休息了兩天,再次撿起來,我又找到兩個 Image 對象上的方法:
# 翻轉、旋轉圖像 image = image.transpose(Image.ROTATE_90) # 將image圖像粘貼base圖像中 # box參數我給的是偏移2元組 base.paste(image, (offset_x, offset_y))
功能搞定生成圖片很是完美,還原了 plist 中的文件名、原始大小、透明區域偏移,整個代碼加上註釋也不到100行。
最後,我還研究了一下 Python 的代碼規範,與 JS、TS 徹底不是一個門派,變量名、函數名都是用小寫,代碼之間用下劃線隔開,感受是回到了讀書時用的 C 語言,終於整個代碼清爽起來了:
雖然東拼西湊將功能實現了,但我總以爲怪怪的,第一次用 Python 作個開源小工具求大神們指點,有那些能夠改進的地方,也但願這個工具腳本能幫助到你們!
代碼下載:https://github.com/ShawnZhang2015/tp-png-split
更多精彩請關注Creator星球遊戲開發社區