8

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

 3 years ago
source link: http://www.creator-star.cn/2020/11/04/%e6%88%91%e7%94%a8-python-%e6%92%b8%e4%ba%86%e4%b8%80%e4%b8%aa-plist-%e5%9b%be%e9%9b%86%e6%8b%86%e5%9b%be%e5%b7%a5%e5%85%b7%ef%bc%81%e9%99%84github%e5%9c%b0%e5%9d%80/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

shawn 发布于 1月前
我用 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)
Python

有了大概的了解,就开始真正的动手了。刚开始真的很不习惯,经常范错,比如:定义变量加 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))
Python

功能搞定生成图片非常完美,还原了 plist 中的文件名、原始大小、透明区域偏移,整个代码加上注释也不到100行。

最后,我还研究了一下 Python 的代码规范,与 JS、TS 完全不是一个门派,变量名、函数名都是用小写,代码之间用下划线隔开,感觉是回到了读书时用的 C 语言,终于整个代码清爽起来了:

image-20201102094643923

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK