• 我用 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 开干!代码大概分成两大部分:

    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

    更多精彩请关注Creator星球游戏开发社区

  • 相关阅读:
    (转)分布式系统原理
    Java常用排序
    19.Java5同步集合类的应用
    18.Java5阻塞队列的应用
    17.Java5的Exchanger同步工具
    16.Java5的CountDownLatch同步工具
    15.Java5的CyclicBarrier同步工具
    14.Java5的Semaphere同步工具
    13.Java5条件阻塞Condition的应用
    Docker部署JavaWeb项目实战
  • 原文地址:https://www.cnblogs.com/creator-star/p/13926602.html
Copyright © 2020-2023  润新知