将Texture Packer制作的.pvr.ccz和.plist文件还原为多个原图

1、准备
1、安装 TexturePacker
2、安装python
3、安装Pillow-2.1.0.win-amd64-py2.7.exe  其他下载https://pypi.python.org/simple/pillow/

2、PVR转PNG.bat的使用
把 xx.plist和xx.pvr.ccz 文件放在工具目录下,直接双击“PVR转PNG.bat”
批处理文件,如果成功的话,在当前目录下就会生成相应的.png文件,这个批处理
可同时转化很多对(xx.plist和xx.pvr.ccz)文件,当然,也有可能失败,
如果失败,我们可以使用另一种方式转化,直接使用TexturePacker工具。
3、使用TexturePacker工具把xx.plist和xx.pvr.ccz转化为.png
    1. TexturePacker中有个PVR Viewer工具,我们可以直接使用这个工具
       进行转化。
    2. 使用PVR Viewer工具打开我们要转化的文件,然后点击File下的Save As,
    保存为.png文件即可,保存时把文件的后缀名添加上.png即可。
4、使用split.py脚本 - 将Texture Packer制作的.pvr.ccz和.plist文件还原为多个原图
    1. split.py脚本只能通过.png和.plist文件还原,而不能直接通过.pvr.ccz和.plist文件,
    所以需要根据2和3中的方法把xx.plist和xx.pvr.ccz转化为.png
    2. 在Dos命令行模式下,进入脚本存放目录,同时需要把.png和.plist文件也放在这个
    目录下,而且要确保.png和.plist文件的文件名相同(例:mm.png和mm.plist),
    然后执行split.py脚本,传入参数(例:上面的mm),然后执行即可。
    3. 当然也有可能不成功,因为split.py脚本是通过分析.plist文件,然后对

     .png文件进行切割,保存,如果失败,可以检查一下.plist文件是否正确。

split.py脚本

把所有需要转化的.pvr.ccz和.plist文件放到和脚本相同目录下,点击脚本运行即可。

[python]  view plain copy
  1. #!python   
  2. import os,sys  
  3. from xml.etree import ElementTree  
  4. from PIL import Image  
  5.   
  6. def endWith(s,*endstring):   
  7.     array = map(s.endswith,endstring)   
  8.     if True in array:   
  9.         return True   
  10.     else:   
  11.         return False   
  12.       
  13. # Get the all files & directories in the specified directory (path).   
  14. def get_recursive_file_list(path):   
  15.     current_files = os.listdir(path)   
  16.     all_files = []   
  17.     for file_name in current_files:   
  18.         full_file_name = os.path.join(path, file_name)  
  19.         if endWith(full_file_name,'.plist'):   
  20.             full_file_name = full_file_name.replace('.plist','')  
  21.             all_files.append(full_file_name)   
  22.    
  23.         if os.path.isdir(full_file_name):   
  24.             next_level_files = get_recursive_file_list(full_file_name)   
  25.             all_files.extend(next_level_files)  
  26.     return all_files  
  27.       
  28. def tree_to_dict(tree):  
  29.     d = {}  
  30.     for index, item in enumerate(tree):  
  31.         if item.tag == 'key':  
  32.             if tree[index+1].tag == 'string':  
  33.                 d[item.text] = tree[index + 1].text  
  34.             elif tree[index + 1].tag == 'true':  
  35.                 d[item.text] = True  
  36.             elif tree[index + 1].tag == 'false':  
  37.                 d[item.text] = False  
  38.             elif tree[index+1].tag == 'dict':  
  39.                 d[item.text] = tree_to_dict(tree[index+1])  
  40.     return d  
  41.   
  42. def gen_png_from_plist(plist_filename, png_filename):  
  43.     file_path = plist_filename.replace('.plist''')  
  44.     big_image = Image.open(png_filename)  
  45.     root = ElementTree.fromstring(open(plist_filename, 'r').read())  
  46.     plist_dict = tree_to_dict(root[0])  
  47.     to_list = lambda x: x.replace('{','').replace('}','').split(',')  
  48.     for k,v in plist_dict['frames'].items():  
  49.         rectlist = to_list(v['frame'])  
  50.         width = int( rectlist[3if v['rotated'else rectlist[2] )  
  51.         height = int( rectlist[2if v['rotated'else rectlist[3] )  
  52.         box=(   
  53.             int(rectlist[0]),  
  54.             int(rectlist[1]),  
  55.             int(rectlist[0]) + width,  
  56.             int(rectlist[1]) + height,  
  57.         )  
  58.         sizelist = [ int(x) for x in to_list(v['sourceSize']) ]  
  59.         rect_on_big = big_image.crop(box)  
  60.   
  61.         if v['rotated']:  
  62.             rect_on_big = rect_on_big.rotate(90)  
  63.   
  64.         result_image = Image.new('RGBA', sizelist, (0,0,0,0))  
  65.         if v['rotated']:  
  66.             result_box=(  
  67.                 ( sizelist[0] - height )/2,  
  68.                 ( sizelist[1] - width )/2,  
  69.                 ( sizelist[0] + height )/2,  
  70.                 ( sizelist[1] + width )/2  
  71.             )  
  72.         else:  
  73.             result_box=(  
  74.                 ( sizelist[0] - width )/2,  
  75.                 ( sizelist[1] - height )/2,  
  76.                 ( sizelist[0] + width )/2,  
  77.                 ( sizelist[1] + height )/2  
  78.             )  
  79.         result_image.paste(rect_on_big, result_box, mask=0)  
  80.   
  81.         if not os.path.isdir(file_path):  
  82.             os.mkdir(file_path)  
  83.         outfile = (file_path+'/' + k).replace('gift_''')  
  84.         #outfile = outfile + '.png'  
  85.         print outfile, "generated"  
  86.         result_image.save(outfile)  
  87.   
  88. if __name__ == '__main__':  
  89.     currtenPath = os.getcwd()   
  90.     allPlistArray = get_recursive_file_list(currtenPath)  
  91.     for plist in allPlistArray:  
  92.         filename = plist  
  93.         plist_filename = filename + '.plist'  
  94.         png_filename = filename + '.png'  
  95.         if (os.path.exists(plist_filename) and os.path.exists(png_filename)):  
  96.             gen_png_from_plist( plist_filename, png_filename )  
  97.         else:  
  98.             print "make sure you have boith plist and png files in the same directory"  

参考: http://www.haodaima.net/art/2682730


原文出处:http://blog.csdn.net/tianxiawuzhei/article/details/44923703

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值