#!python
import os,sys
from xml.etree import ElementTree
from PIL import Image
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 == 'integer':
d[item.text] = int(tree[index + 1].text)
elif tree[index+1].tag == 'dict':
d[item.text] = tree_to_dict(tree[index+1])
return d
def read_rect(dict):
return [dict['x'],dict['y'],dict['width'],dict['height']];
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():
if v.has_key('textureRect'):
rectlist = to_list(v['textureRect'])
elif v.has_key('frame'):
rectlist = to_list(v['frame'])
else:
rectlist = read_rect(v)
if v.has_key('rotated'):
width = int( rectlist[3] if v['rotated'] else rectlist[2] )
height = int( rectlist[2] if v['rotated'] else rectlist[3] )
else:
width = int( rectlist[2] )
height = int( rectlist[3] )
box=(
int(rectlist[0]),
int(rectlist[1]),
int(rectlist[0]) + width,
int(rectlist[1]) + height,
)
#print box
#print v
if v.has_key('spriteSize'):
spriteSize = v['spriteSize']
elif v.has_key('sourceSize'):
spriteSize = v['sourceSize']
elif v.has_key("width"):
spriteSize = str(v['width']) + ',' + str(v['height'])
sizelist = [ int(x) for x in to_list(spriteSize)]
#print sizelist
rect_on_big = big_image.crop(box)
if (v.has_key('textureRotated') and v['textureRotated']) or (v.has_key('rotated') and v['rotated']):
rect_on_big = rect_on_big.rotate(90)
result_image = Image.new('RGBA', sizelist, (0,0,0,0))
if (v.has_key('textureRotated') and v['textureRotated']) or (v.has_key('rotated') and v['rotated']):
result_box=(
( sizelist[0] - height )/2,
( sizelist[1] - width )/2,
( sizelist[0] + height )/2,
( sizelist[1] + width )/2
)
else:
result_box=(
( sizelist[0] - width )/2,
( sizelist[1] - height )/2,
( sizelist[0] + width )/2,
( sizelist[1] + height )/2
)
result_image.paste(rect_on_big, result_box, mask=0)
if not os.path.isdir(file_path):
os.mkdir(file_path)
k = k.replace('/', '_')
outfile = (file_path+'/' + k).replace('gift_', '')
#print k
if outfile.find('.png') == -1:
outfile = outfile + '.png'
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 both plist and png files in the same directory"
在iOS和Mac开发中,plist(Property List)文件是一种常用的数据存储格式,它能存储XML或二进制数据,包括字符串、数字、日期、数组、字典等多种类型。本话题聚焦于一个经过改进的plist图片分拆分割工具,现在它可以支持format 0, 1, 2, 3四种格式,解决了原有工具对format 0不支持的问题。 1. **plist文件格式:** - Format 0:这是最原始的XML格式,易于阅读和调试,但文件体积较大。 - Format 1:是二进制格式,更紧凑且读写速度快,但人类不易直接解读。 - Format 2:是iOS 5.0引入的优化二进制格式,它比Format 1更节省空间,特别是在处理大型数据结构时。 - Format 3:在iOS 9.0中引入,进一步优化了二进制格式,支持更大的数据量和更复杂的数据结构。 2. **图片分拆:** 在游戏开发,特别是使用Cocos2d-x框架时,为了提高加载速度和内存管理,往往将大图集拆分为多个小图片。这通常涉及到将包含多个图像的单一plist文件分解为单独的图片资源。分拆过程可以减少内存占用,因为只会在需要时加载特定的图片,而不是一次性加载整个图集。 3. **Cocos2d与plist:** Cocos2d是一个2D游戏开发框架,它广泛使用plist文件来管理纹理图集。这些图集(.atlas文件)包含了图片资源和对应的坐标信息,用于在游戏中快速地加载和显示图片。Cocos2d使用plist文件来解析这些信息,因此能够正确地渲染图集中的每个图像。 4. **修改工具的挑战:** 修改原工具以支持所有四种format的plist文件并不简单。每个format的解析方式不同,需要深入理解Apple的官方文档和plist文件的内部结构。format 0的XML解析相对直观,但format 1, 2, 3的二进制解析则需要处理位运算、数据类型编码等复杂问题。 5. **优化与兼容性:** 改进后的工具不仅增加了对format 0的支持,还可能增强了对其他format的处理效率和稳定性。这对于开发者来说是重要的,因为他们可能遇到各种来源和格式的plist文件,而工具的广泛兼容性能够减少适配问题。 6. **使用方法:** 使用这个修改过的工具,开发者可以导入包含多种format的plist文件,然后选择性地分拆图片。这有助于优化游戏资源,提高加载速度,并降低内存使用。 7. **注意事项:** 在进行图片分拆时,需要注意保持文件结构的完整性,以免影响Cocos2d或其他依赖于这些资源的程序。同时,确保在更新资源后更新对应的plist文件,以免造成加载错误。 这个改进后的plist图片分拆工具对于使用Cocos2d进行游戏开发的团队来说是一个有价值的资源,它增强了对不同format的兼容性,提高了工作效率,并优化了资源管理。对于那些遇到format 0 plist文件问题的开发者,这是一个值得尝试的解决方案。






















- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- subingyan2018-11-10反正我用了之后format为3的拆不出来
- i_dontknow2019-08-23解析format 3报错
- a3721876632019-05-24反正我用了之后format为3的拆不出来

- 粉丝: 0
- 资源: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- stm32cubeclt mac版本
- 基于PLC的换热站自动控制系统的设计与实现:组态画面、梯形图程序及接线图详解,基于PLC的换热站自动控制系统的设计与实现:组态画面、梯形图程序及接线图详解,基于PLC的热站自动控制系统设计热站组态热站
- c&c++逻辑思维训练题.rar
- 数论中的哥德巴赫强猜想简略证明过程
- Pycharm2025社区版安装教程
- Linux中用户管理相关常用命令
- properties和yml文件对比合并
- 基于混沌麻雀搜索算法的无人机航迹规划方法:CSSA策略实现与性能分析,基于混沌麻雀搜索算法的无人机航迹规划方法:CSSA策略实现与性能分析,麻雀搜索算法(SSA)文章复现:基于混沌麻雀搜索算法的无人
- Word转Latex-中文版latex
- sshpass-1.06-1-amd64.deb
- 掌握串口通讯,解锁电力仪表及信号采集技术-深入剖析易语言源码及其在工业控制中的应用,易语言串口通讯源码详解:掌握RS485通讯技术,深入理解MODBUS协议与CRC16校验算法,轻松控制电力仪表与信
- 網球比賽訓練數據youtube
- tcpdump-4.9.3-3.ky10.x86-64.rpm
- 工具变量-城市基尼系数(1992-2023年).xlsx
- arcgis教程系列:昆明市区位图(录屏+成图+工程+数据)
- 801617774366427HALParking.zip


