我用 Python 撸了一个 plist 图集拆图工具!附上github源码
这些年,我一直在使用 JavaScript 、CocosCreator 做开发,只要是他们不能解决的,我都不太愿意去弄,或者说是不太情愿去做。真的是手中有把锤子,看什么都是钉子,越是熟悉一样东西,越容易被思维定式给束缚,难以成长!
前段时间,我在尝试学习 Python,想用来做点什么,一直没想好。我必须得学以致用才行,不然过两天又忘记了。
但这次机会来了!
前两天,有位老朋友找到我,寻求 Cocos 图集的裁图工具,我顺手给了一个 Windows 版本的 PngSplit.exe,我曾经用过多次感觉还行!
小知识:初学的伙伴可能还不清楚,什么是图集?
图集通常是使用 TexturePacker 这个工具,将多张小的碎图合并,导出生成一个 png 文件与同名的 plist 文件。
游戏引擎通过解析 plist 文件,获取对应 png 图片上的子图,还原碎图。通过图集可以减少文件体积,提高文件加载速度,更重要的是他能减少 Drawall 提升渲染效率!
但,我刚给了朋友后,想到如果是 Cocos 格式的图集是有 plist 文件的,通过 plist 可以完美换原之前的碎图。但使用 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 完全不是一个门派,变量名、函数名都是用小写,代码之间用下划线隔开,感觉是回到了读书时用的 C 语言,终于整个代码清爽起来了:
虽然东拼西凑将功能实现了,但我总觉得怪怪的,第一次用 Python 做个开源小工具求大神们指点,有那些可以改进的地方,也希望这个工具脚本能帮助到大家!
代码下载:https://github.com/ShawnZhang2015/tp-png-split
更多精彩请关注Creator星球游戏开发社区
我用 Python 撸了一个 plist 图集拆图工具!附上github源码的更多相关文章
- 基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
基于python语言的tensorflow的‘端到端’的字符型验证码识别 1 Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...
- VopSdk一个高逼格微信公众号开发SDK(源码下载)
看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...
- 一个3D ar打飞机的游戏iOS源码
这是国内目前第一款集合了AR实景,3D游戏和人脸识别的射击游戏,通过旋转和改变手机的角度与位置,所有的射击操作都靠手势来完成,目前所有的源码全部都在这里.appStore地址:https://itun ...
- 动手写一个Remoting接口测试工具(附源码下载)
基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本,无疑非常浪费时间.所以,我想写一个能自 ...
- 一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)
前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了. 本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,E ...
- 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码
一.前言 最近在看<深入java虚拟机>,看完后,打算自己实际编译一个jvm出来看看,实践一下. 书上提到了Oracle JDK和OpenJdk的关系,Oracle Jdk7 和OpenJ ...
- 【Python学习】记一次开源博客系统Blog_mini源码学习历程-Flask
今天准备看看Flask框架,找到一套博客系统源码,拿来学习学习 https://github.com/xpleaf/Blog_mini 演示地址 http://140.143.205.19 技术框架 ...
- 【分享】自己写的一个可空的DateTimePicker控件-附源码
最近这段时间在重构以前的一个项目,其中有一项就是要把DateTimePicker控件值可空.大家都知道的DateTimePicker值为DateTime类型,DateTime类型值不能等于Null.但 ...
随机推荐
- Java泛型中的类型参数和通配符类型
类型参数 泛型有三种实现方式,分别是泛型接口.泛型类.泛型方法,下面通过泛型方法来介绍什么是类型参数. 泛型方法声明方式:访问修饰符 <T,K,S...> 返回类型 方法名(方法参数){方 ...
- python3 结束进程
为什么会去结束进程呢?因为在做appium中遇到H5跳转了多个页面的时候,出现了获取的pagesource是上一个页面的情况,这时候就需要先退出webview,然后杀掉chromedriver的进程, ...
- Python练习题 006:输出九九乘法表
[Python练习题 006] 输出九九乘法表 --------------------------------------------------- 照理这题不难,逻辑关系弄对了就好办,但数学渣的我 ...
- Typore的简单用法
1 无序列表使用方法 +号和空格一起按就可以写出这个点 2 有序列表使用方法 .先写1.然后打个空格就再回车 3 使用#和空格表示一级标题 一级标题 4 使用##和空格表示二级标题 5 二级标题 6 ...
- 搭建go-stress-testing压力测试
参考地址:https://github.com/link1st/go-stress-testing安装golang环境 yum install -y golang 下载软件包 wget -q http ...
- Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多
在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...
- docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
故障描述: [root@docker01 ~]# docker run centos docker: Error response from daemon: Get https://registry- ...
- background-size 详解
backgroun-size:cover; .是按照等比缩放铺满整个区域.主要用于图片比div小的时候,将图片按照某一边的比例扩大以填充整个div背景. .优点:图片不会被拉升,且实用于div长度和宽 ...
- GUI版本的emacs
概要 emacs 配置 X11 配置 输入法配置 spacemacs 中的配置 fcitx 汉字显示方块的问题 总结 优势 劣势 概要 之前一直使用 terminal 版本的 emacs, 性能和显示 ...
- 解决SpringBoot 定时计划 quartz job 任务重复执行多次(10次)
上一篇:SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源 设置了多个 任务,本应该是各司其职的,任务调用多线程处理任务,but这个定时任务竟然同时跑了10次???如 ...