python分割有plist文件的精灵表

本文介绍如何使用Python和PIL库从Zwoptex生成的精灵图中还原原始图片的方法。通过解析plist文件获取图片尺寸及位置信息,并利用这些信息切割精灵图中的子图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  昨天写了Zwoptex生成精灵表,有合就有分,能不能把合成的文件再原模原样的还原回来,哈哈……于是,今天利用闲暇的时间想一个问题:plist是用xml格式的,强大的python中的PIL(Python Imaging Library)可以处理各种图片,更不用说png图片了。
  昨天分析过plist,除了一个名字外,今天还能用上的还有两个属性,原始的文件的尺寸大小(这必须得要)和纹理在精灵表中的位置和大小,因为对xml的操作不太多,只是读取数据,就选用轻量级的ElementTree,把从xml解析出来的字符串数据转换成int类型,这就得到了图片属性的真实数据,这在精灵表上复制那个区域内的图片,然后在粘贴到新建的图片里面,哈哈,这样就搞定了。
  在操作的时候会用到PIL库,点击下载PIL
  大概的思路是说出来啦,最实在的还是把代码粘贴出来,运行一下看看:
#! /usr/lical/bin/python
import os,Image,sys
from xml.etree import ElementTree
filenames=os.listdir(os.getcwd())
i=0
if len(sys.argv)==2:
    filepath=sys.argv[1]
    for filename in filenames:
        if (filename==filepath+'.png') or (filename==filepath+'.plist'):
            i +=1
    if i==0:
        print("No such file or directory!")
    elif i==1:
        print("Both .png and .plist are need!")
    else:
        treeroot=ElementTree
        image=Image.open(filepath+'.png')  #open image
        sizelist=(0,0)


        for dict1 in treeroot:
            for index1,item1 in enumerate(dict1): #
        #        print (item1.tag,item1.attrib,item1.text)
                if item1.text=='frames':  #get node who Value=frames 
        #            print (index1)
                    i=0
                    dict2 = dict1[index1+1]
        #            print(len(dict2))
        #            for index2,item2 in enumerate(dict2):
        #                print(item2.tag,item2.attrib,item2.text)
                    while i<len(dict2):
                        print("name:"+dict2[i].text)
                        picname=dict2[i].text
                        dict3 = dict2[i+1]
                        for index3,item3 in enumerate(dict3):
        #                    print(item3.tag,item3.attrib,item3.text)
                            if item3.text=='spriteSourceSize':
        #                        print(dict3[index3+1].text)
                                size=dict3[index3+1].text
                                sizelist = size.replace('{','').replace('}','').split(',')
                                sizelist=(int(sizelist[0]),int(sizelist[1]));
                                #print(sizelist)
                                
                            if item3.text=='textureRect':
        #                        print(dict3[index3+1].text)
                                rect=dict3[index3+1].text
                                rectlist = rect.replace('{','').replace('}','').split(',')
        #                        print(rectlist)
                                box=(int(rectlist[0]),int(rectlist[1]),int(rectlist[0])+int(rectlist[2]),int(rectlist[1])+int(rectlist[3]))
                                print("size:")
                                print(sizelist)
                                print("onBig:")
                                print(box)
                                xim=image.crop(box)
                                xxim=Image.new('RGB',sizelist,(255,255,255))
                                box1=((sizelist[0]-box[2]+box[0])/2,(sizelist[1]-box[3]+box[1])/2,(sizelist[0]+box[2]-box[0])/2,(sizelist[1]+box[3]-box[1])/2)
                                print("onNew:")
                                print(box1)
                                xxim.paste(xim,box1,mask=0)
                                if os.path.isdir(filepath):
                                    pass
                                else:
                                    os.mkdir(filepath)
                                outfile=filepath+'/'+picname
                                print("newPath:"+outfile)
                                xxim.save(outfile)
                        i +=2
else:
    print("Please enter only one parameter!")


里面的print比较多,因为怕出错了不好找,就写几步,print出来看看数据对不对。
  复制这段代码,保存,然后在终端写:python xx.py file(就是想分割的文件名,不加后缀)。

  本人运行环境:Mac OSX10.7,python 2.7.3,PIL 1.1.7,完美通过!

  本文原发布于键赏乾坤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值