zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Android Developers:使ListView滑动流畅
    Nexus 搭建maven 私有仓库
    Eclipse 配置Maven以及修改默认Repository
    maven常用命令介绍
    maven 相关
    session机制详解以及session的相关应用
    正确理解web交互中的cookie与session
    前端开发中Cookie那些事儿
    html转义表
    常用的Linux命令
  • 原文地址:https://www.cnblogs.com/ring1992/p/13970639.html
Copyright © 2011-2022 走看看