TexturePacker逆向-plist图集拆分小图

python处理图像需要用到PIL类库

Mac安装PIL

  • 推荐使用pip工具安装
  • 现在已经用Pillow代替PIL,在使用上没有区别,API都是相同的
  • Pillow类库依赖另一个模块:multiprocessing

安装步骤:

  1. 使用命令sudo easy_install pip安装pip
  2. 使用命令sudo pip install multiprocessing安装依赖库
  3. 使用命令sudo pip install Pillow安装PIL

执行完所有命令后,就可以正常使用PIL类库 

解析Plist文件

  • 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 texture
原文地址:https://www.cnblogs.com/ring1992/p/13970639.html