我用 Python 撸了一个 plist 图集拆图工具!附github地址插图

这些年,我一直在使用 JavaScript 、CocosCreator 做开发,只要是他们不能解决的,我都不太愿意去弄,或者说是不太情愿去做。真的是手中有把锤子,看什么都是钉子,越是熟悉一样东西,越容易被思维定式给束缚,难以成长!

前段时间,我在尝试学习 Python,想用来做点什么,一直没想好。我必须得学以致用才行,不然过两天又忘记了。

但这次机会来了!

前两天,有位老朋友找到我,寻求 Cocos 图集的裁图工具,我顺手给了一个 Windows 版本的 PngSplit.exe,我曾经用过多次感觉还行!

image-20201101234056094

小知识:初学的伙伴可能还不清楚,什么是图集

图集通常是使用 TexturePacker 这个工具,将多张小的碎图合并,导出生成一个 png 文件与同名的 plist 文件。

image-20201101232111490

游戏引擎通过解析 plist 文件,获取对应 png 图片上的子图,还原碎图。通过图集可以减少文件体积,提高文件加载速度,更重要的是他能减少 Drawall 提升渲染效率!

但,我刚给了朋友后,想到如果是 Cocos 格式的图集是有 plist 文件的,通过 plist 可以完美换原之前的碎图。但使用 PngSplit 拆分一些有透明像素的帧动画图片就不行了!

我用 Python 撸了一个 plist 图集拆图工具!附github地址插图(2)

导出的子图周边没有透明,并不是还原碎图最原始的样子,这样生成的资源,要重新制作动画难度非常之大!

想到这里,有点点兴奋,我拿起 Python 开干!代码大概分成两大部分:

  1. 解析 plist 文件,解析出子图在图集中的矩形位置
  2. 通过分析出的子图矩形数据,将子图纹理导出生成图像

大的思维有了,解析 plist 应该是有对应的工具库的,我也是 Python 小白面向百度编程绝对是不能不掌握的技巧

输入:python3 plist 解析

image-20201102085405911

出来的大部分是用 plistlib 这个库,而且是 Python 自带的!非常好,第一个问题有解了,先不管细节,再看第二个问题!

我在百度上搜索:python3 图片处理

image-20201102085806645

有一个名为 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 语言,终于整个代码清爽起来了:

image-20201102094643923

虽然东拼西凑将功能实现了,但我总觉得怪怪的,第一次用 Python 做个开源小工具求大神们指点,有那些可以改进的地方,也希望这个工具脚本能帮助到大家!

代码下载:https://github.com/ShawnZhang2015/tp-png-split

最后修改日期:2020年11月4日

作者