昨天写了Zwoptex生成精灵表,有合就有分,能不能把合成的文件再原模原样的还原回来,哈哈……于是,今天利用闲暇的时间想一个问题:plist是用xml格式的,强大的python中的PIL(Python Imaging Library)可以处理各种图片,更不用说png图片了。
昨天分析过plist,除了一个名字外,今天还能用上的还有两个属性,原始的文件的尺寸大小(这必须得要)和纹理在精灵表中的位置和大小,因为对xml的操作不太多,只是读取数据,就选用轻量级的ElementTree,把从xml解析出来的字符串数据转换成int类型,这就得到了图片属性的真实数据,这在精灵表上复制那个区域内的图片,然后在粘贴到新建的图片里面,哈哈,这样就搞定了。
在操作的时候会用到PIL库,点击下载PIL。
大概的思路是说出来啦,最实在的还是把代码粘贴出来,运行一下看看:
里面的print比较多,因为怕出错了不好找,就写几步,print出来看看数据对不对。
复制这段代码,保存,然后在终端写:python xx.py file(就是想分割的文件名,不加后缀)。
昨天分析过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,完美通过!
本文原发布于键赏乾坤。