TexturePacker逆向——拆分大图为小图
2019-03-25 本文已影响0人
吃菜小怪兽
系统:macOS
脚本:python
python处理图像需要用到PIL类库
Mac安装PIL
- 推荐使用pip工具安装
- 现在已经用Pillow代替PIL,在使用上没有区别,API都是相同的
- Pillow类库依赖另一个模块:multiprocessing
安装步骤:
- 使用命令
sudo easy_install pip
安装pip - 使用命令
sudo pip install multiprocessing
安装依赖库 - 使用命令
sudo pip install Pillow
安装PIL
执行完所有命令后,就可以正常使用PIL类库
解析Plist文件
小图信息主要在frames字段里
- frame: 小图在大图中位置信息{{左上角顶点坐标},{小图宽高}}
- offset: 小图裁剪前后中心点的偏移值
- rotated: 小图在大图中是否被旋转
- sourceColorRect: 小图裁剪的信息
- sourceSize: 小图原尺寸大小
算法脚本
#!python
import os,sys
import plistlib
from PIL import Image
def gen_png_from_plist(plist_filename, png_filename):
file_path = plist_filename.replace('.plist', '')
big_image = Image.open(png_filename)
root = plistlib.readPlist(plist_filename)
frames = root['frames']
to_list = lambda x: x.replace('{','').replace('}','').split(',')
to_int = lambda x:int(x)
for frame in frames:
framename = frame.replace('.png', '')
size = frames[frame].sourceColorRect
size = to_list(size)
size = map(to_int, size)
spriteSize = frames[frame].sourceSize
spriteSize = to_list(spriteSize)
spriteSize = map(to_int, spriteSize)
textureRect = frames[frame].frame
textureRect = to_list(textureRect)
textureRect = map(to_int, textureRect)
result_box = textureRect
result_image = Image.new('RGBA', spriteSize, 0)
if frames[frame].rotated:
result_box[0] = int(textureRect[0])
result_box[1] = int(textureRect[1])
result_box[2] = int(textureRect[0] + textureRect[3])
result_box[3] = int(textureRect[1] + textureRect[2])
else:
result_box[0] = int(textureRect[0])
result_box[1] = int(textureRect[1])
result_box[2] = int(textureRect[0] + textureRect[2])
result_box[3] = int(textureRect[1] + textureRect[3])
#print(result_box, frames[frame].rotated, frame)
rect_on_big = big_image.crop(result_box)
if frames[frame].rotated:
rect_on_big = rect_on_big.transpose(Image.ROTATE_90)
result_image.paste(rect_on_big)
if not os.path.isdir(file_path):
os.mkdir(file_path)
outfile = (file_path+'/' + framename+'.png')
print outfile, "generated"
result_image.save(outfile)
if __name__ == '__main__':
filename = sys.argv[1]
plist_filename = filename + '.plist'
png_filename = filename + '.png'
if (os.path.exists(plist_filename) and os.path.exists(png_filename)):
gen_png_from_plist( plist_filename, png_filename )
else:
print "make sure you have boith plist and png files in the same directory"
将脚本命名为unpack_plist.py
,放在plist、png文件同级目录中
用法:
python unpack_plist.py plist文件名称
例:
python unpack_plist.py bird