这些年,我一直在使用 JavaScript 、CocosCreator做开发,只要是他们不能解决的,我都不太愿意去弄,或者说是不太情愿去做。真的是手中有把锤子,看什么都是钉子,越是熟悉一样东西,越容易被思维定式给束缚,难以成长!
前段时间,我在尝试学习 Python,想用来做点什么,一直没想好。我必须得学以致用才行,不然过两天又忘记了,但这次机会来了!
前两天,有位老朋友找到我,寻求 Cocos 图集的裁图工具,我顺手给了一个 Windows 版本的 PngSplit.exe,我曾经用过多次感觉还行!
❝小知识:初学的伙伴可能还不清楚,什么是「图集」?
图集通常是使用 TexturePacker 这个工具,将多张小的碎图合并,导出生成一个 png 文件与同名的 plist 文件。
TexturePacker Mac版
游戏引擎通过解析 plist 文件,获取对应 png 图片上的子图,还原碎图。通过图集可以减少文件体积,提高文件加载速度,更重要的是他能减少 Drawall 提升渲染效率!
❞
但,我刚给了朋友后,想到如果是 Cocos 格式的图集是有 plist 文件的,通过 plist 可以完美换原之前的碎图,但使用 PngSplit 拆分一些有透明像素的帧动画图片就不行了!
PngSplit 导出的子图有两大缺陷:
图像周围透明区域,并不是还原碎图最原始的样子;
无法还原文件名,特别是序列帧文件,文件顺序是乱序的;
这样生成的资源,要重新制作动画难度非常之大,还需要花更多的时间。想到这里,有点点兴奋,我拿起 Python 开干!代码大概分成两大部分:
解析 plist 文件,解析出子图在图集中的矩形位置
通过分析出的子图矩形数据,将子图纹理导出生成图像
大的思维有了,解析 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 完全不是一个门派的。Python 的变量名、函数名都是用小写,代码之间用下划线隔开,感觉是回到了读书时用的 C 语言的年代
终于整个代码清爽起来了,而且我还加了不少注释。
虽然东拼西凑将功能实现了,但我总觉得怪怪的,第一次用 Python 做个开源小工具求大神们指点,还有那些可以改进的地方,也希望这个工具脚本能帮助到大家,节省、省力、省钱!
github仓库地址,您也可以通过【阅读原文】跳转链接!
https://github.com/ShawnZhang2015/tp-png-split.git
原创不易,码字不易,感谢点赞分享,愿我们一起共同成长!
1. 2020社区最新教程精华700+页PDF!
2. 腾讯课堂Creator零基础修仙实战上线啦!
3. 游戏换皮被默许,微信后台竟然支持代码授权
4. NativeAPI手机原生功能调用接口丰富
5. Creator全自动代码生成器来袭!
6. 卧槽,一不小心我成副业案列了!