2012-07-31 199 views
1

我需要爲iPad 3視網膜顯示更新一些.png圖像。唯一的問題是這些.png圖像在.plist文件中。從.plist文件中提取.png圖像

所以... 1)我可以從.plist文件中手動提取.png文件嗎?還是有一個程序可以做到這一點? 或2)我可以編輯都在的.plist文件...爲例.png文件的分辨率...

<key>opponent_left_1.png</key> 
    <dict> 
     <key>frame</key> 
     <string>{{1914,1764},{88,81}}</string> 
     <key>offset</key> 
     <string>{41,-35}</string> 
     <key>sourceSize</key> 
     <string>{334,355}</string> 
    </dict> 

謝謝!

回答

1

PNGs不在PLIST文件中,它只是一個簡單的文本文件。它們可能位於Resources文件夾中,該文件夾與此PLIST文件相關聯(基於Mac OS X軟件包體系結構的答案)。

0

這是用於提取.png圖像的代碼。創建extract.py文件與此代碼和運行命令行: extract.py name_of_sheet_without_extension

這個腳本創建提取.png文件的文件夾。

#! /usr/lical/bin/python 
import os,Image,sys 
from xml.etree import ElementTree 

def tree_to_dict(tree): 
    d = {} 
    for index, item in enumerate(tree): 
     if item.tag == 'key': 
      if tree[index+1].tag == 'string': 
       d[item.text] = tree[index + 1].text 
      elif tree[index + 1].tag == 'true': 
       d[item.text] = True 
      elif tree[index + 1].tag == 'false': 
       d[item.text] = False 
      elif tree[index+1].tag == 'dict': 
       d[item.text] = tree_to_dict(tree[index+1]) 
    return d 

def gen_png_from_plist(plist_filename, png_filename): 
    file_path = plist_filename.replace('.plist', '') 
    big_image = Image.open(png_filename) 
    root = ElementTree.fromstring(open(plist_filename, 'r').read()) 
    plist_dict = tree_to_dict(root[0]) 
    to_list = lambda x: x.replace('{','').replace('}','').split(',') 
    for k,v in plist_dict['frames'].items(): 
     print "-----start\n----------" 
     rectlist = to_list(v['frame']) 
     print rectlist, "--------rectlist" 
     offset = to_list(v['offset']) 
     print offset, "--------offset" 
     width = int(rectlist[3] if v['rotated'] else rectlist[2]) 
     height = int(rectlist[2] if v['rotated'] else rectlist[3]) 
     print width,height,"----width,height" 
     box=( 
      int(rectlist[0]), 
      int(rectlist[1]), 
      int(rectlist[0]) + width, 
      int(rectlist[1]) + height, 
      ) 
     # bos is start & end point 
     print box,"-----_box-" 
     print v['rotated'], "---rotated" 

     sizelist = [ int(x) for x in to_list(v['sourceSize'])] 
     rect_on_big = big_image.crop(box) 
     if v['rotated']: 
      rect_on_big = rect_on_big.rotate(90) 
     result_image = Image.new('RGBA', sizelist, (0,0,0,0)) 
     if v['rotated']: 
      result_box=(
       (sizelist[0] - height)/2 + int(offset[0]), 
       (sizelist[1] - width)/2 - int(offset[1]), 
       (sizelist[0] + height)/2 + int(offset[0]), 
       (sizelist[1] + width)/2 - int(offset[1]) 
      ) 
     else: 
      result_box=(
       (sizelist[0] - width)/2 + int(offset[0]), 
       (sizelist[1] - height)/2 - int(offset[1]), 
       (sizelist[0] + width)/2 + int(offset[0]), 
       (sizelist[1] + height)/2 - int(offset[1]) 
      ) 
     result_image.paste(rect_on_big, result_box, mask=0) 
     if not os.path.isdir(file_path): 
      os.mkdir(file_path) 
     outfile = (file_path+'/' + k).replace('gift_', '') 
     print result_box,"-----result_box-" 
     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" 
0

.plist包含壓縮在一個mazior png中的不同png文件的信息。如果你有.plist和他的關聯.png文件,那麼你可以使用TextureUnpacker解壓縮。

如果您的電腦上裝有Java,或者您可能正在安裝,那麼您可以使用TextureUnpacker解包.plist文件。它還支持在LibGdx項目中使用的.pack文件以及用於像unity這樣的許多引擎中的.xml文件來打包紋理。

https://github.com/itsabhiaryan/TextureUnPacker