首页 > Python > python2_04分割有plist文件的精灵表

python2_04分割有plist文件的精灵表

  置顶更新:最近写了一个MAC版的APP来分割有plist文件的精灵表(照顾用python脚本总是出现问题的朋友),请移步至https://github.com/afantree/CutPicture。点击下载按钮即可下载,也可自己下载code手工编译。

==========时间分割线==========

  昨天写了Zwoptex生成精灵表,有合就有分,能不能把合成的文件再原模原样的还原回来,哈哈……于是,今天利用闲暇的时间想一个问题:plist是用xml格式的,强大的python中的PIL(Python Imaging Library)可以处理各种图片,更不用说png图片了。
  昨天分析过plist,除了一个名字外,今天还能用上的还有两个属性,原始的文件的尺寸大小(这必须得要)和纹理在精灵表中的位置和大小,因为对xml的操作不太多,只是读取数据,就选用轻量级的ElementTree,把从xml解析出来的字符串数据转换成int类型,这就得到了图片属性的真实数据,这在精灵表上复制那个区域内的图片,然后在粘贴到新建的图片里面,哈哈,这样就搞定了。
  在操作的时候会用到PIL库,自己到官网下载源码安装。
  大概的思路是说出来啦,最实在的还是把代码粘贴出来,运行一下看看:

#encoding=utf-8
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.parse(filepath+'.plist').getroot()
        #p=list(per.iter("key"))
        image=Image.open(filepath+'.png')  #open image
        sizelist=(0,0)

        #box=(0,0,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,完美通过!
=============2015年3月25日更新=============
  如果在上面的脚本有问题,没有达到你的需求,请移步至《python2分割有plist文件的精灵表(TexturePacker的线上版)》,试试另外一种方式!
  ^_^~~,有问题欢迎留言交流。
  

  1. Replica rolex watches 8月 19th, 2012 @ 21:53 | #1

    Itˇs really a cool and useful piece of information. I am glad that you simply shared this useful info with us. Please keep us informed like this. Thank you for sharing.

  2. Dea 9月 2nd, 2012 @ 03:56 | #2

    Learinng a ton from these neat articles.

  3. 9月 5th, 2013 @ 16:11 | #3

    你好 能做个能在linux下面运行的么?谢谢

    • 阿凡树 9月 12th, 2013 @ 21:01 | #4

      呵呵,有python解释器即可。

  4. laoyur 10月 9th, 2013 @ 14:07 | #5

    哥们,python 2.7.2报错:
    Traceback (most recent call last):
    File “split_png_plist.py”, line 20, in
    for dict1 in treeroot:
    TypeError: ‘module’ object is not iterable

  5. 阿凡树 10月 9th, 2013 @ 14:34 | #6

    @laoyur
    嗯,谢谢指正错误!上个月迁移站点到BAE上面的时候,因为MySql数据库编码的问题,折腾了很长的时间,里面的代码可能给弄丢了。。。第20行为:treeroot=ElementTree.parse(filepath+’.plist’).getroot()

    我有重新编辑了,有问题随时可以交流O(∩_∩)O~

  6. laoyur 10月 10th, 2013 @ 09:15 | #7

    我昨天后来使用stackoverflow的另一个版本搞定了,不过估计跟你的大差不差吧,python我几乎不懂,所以不深究其中了,有兴趣可以看下:
    http://coastline.freepgs.com/archives/275

    • 阿凡树 10月 10th, 2013 @ 10:04 | #8

      图片资源打包器常见的有两种,Zwoptex 和 Texture Packer,他们生成的XML(plist)文件的格式是不一样的,我的这个是解析Zwoptex 生成的png 和 plist ,而你发表的文章说的是另外一个。

  7. laoyur 10月 11th, 2013 @ 09:30 | #9

    @阿凡树
    原来两者是不同的,感谢指正!我会更新我的相关文章。另外,你重新编辑原文后,python的缩进都没了,这可是个大灾难 :),最好重新编辑下

    • 阿凡树 10月 11th, 2013 @ 09:58 | #10

      好的O(∩_∩)O~

  8. 0000 9月 5th, 2014 @ 14:15 | #11

    没有保存小图片的啊

    • 阿凡树 9月 5th, 2014 @ 14:33 | #12

      if os.path.isdir(filepath):这个就是创建文件夹的呀,你可能会遇到下面几种情况:
      1.图片资源打包器常见的有两种,Zwoptex 和 Texture Packer,他们生成的XML(plist)文件的格式是不一样的。
      2.plist和png,还有脚本在同一个目录下面。
      3.终端的执行路径。
      希望这些问题能帮助到你。

  9. 9527 3月 25th, 2015 @ 14:32 | #13

    你好!zwoptex 的生成的plist 文件时出错。 大神帮忙看看,谢谢~~

    Traceback (most recent call last):
    File “encrypt_res.py”, line 16, in
    treeroot=ElementTree.parse(filepath+’.plist’).getroot()
    File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”, line 1182, in parse
    tree.parse(source, parser)
    File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”, line 656, in parse
    parser.feed(data)
    File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”, line 1642, in feed
    self._raiseerror(v)
    File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py”, line 1506, in _raiseerror
    raise err
    xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 9

    • 阿凡树 3月 25th, 2015 @ 14:57 | #14

      以下请注意两点
      1.plist和png,还有脚本在同一个目录下面。
      2.终端的执行路径。
      希望这些问题能帮助到你。真要是还不可以的话,加Q:72939#7005 (#去掉,防止机器人抓取)。
      我帮你看看

评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks