python處理圖像需要用到PIL類庫
Mac安裝PIL
- 推薦使用pip工具安裝
- 現在已經用Pillow代替PIL,在使用上沒有區別,API都是相同的
- Pillow類庫依賴另一個模塊:multiprocessing
安裝步驟:
- 使用命令
sudo easy_install pip
安裝pip - 使用命令
sudo pip install multiprocessing
安裝依賴庫 - 使用命令
sudo pip install Pillow
安裝PIL
執行完所有命令后,就可以正常使用PIL類庫
解析Plist文件
- frame: 小圖在大圖中位置信息{{左上角頂點坐標},{小圖寬高}}
- offset: 小圖裁剪前后中心點的偏移值
- rotated: 小圖在大圖中是否被旋轉
- sourceColorRect: 小圖裁剪的信息
- sourceSize: 小圖原尺寸大小
腳本
#!python import os,sys import plistlib from PIL import Image def gen_png_from_plist(plist_filename, png_filename): file_path = plist_filename.replace('.plist', '') big_image = Image.open(png_filename) root = plistlib.readPlist(plist_filename) frames = root['frames'] to_list = lambda x: x.replace('{','').replace('}','').split(',') to_int = lambda x:int(x) for frame in frames: framename = frame.replace('.png', '') size = frames[frame].sourceColorRect size = to_list(size) size = map(to_int, size) spriteSize = frames[frame].sourceSize spriteSize = to_list(spriteSize) spriteSize = map(to_int, spriteSize) textureRect = frames[frame].frame textureRect = to_list(textureRect) textureRect = map(to_int, textureRect) result_box = textureRect result_image = Image.new('RGBA', spriteSize, 0) if frames[frame].rotated: result_box[0] = int(textureRect[0]) result_box[1] = int(textureRect[1]) result_box[2] = int(textureRect[0] + textureRect[3]) result_box[3] = int(textureRect[1] + textureRect[2]) else: result_box[0] = int(textureRect[0]) result_box[1] = int(textureRect[1]) result_box[2] = int(textureRect[0] + textureRect[2]) result_box[3] = int(textureRect[1] + textureRect[3]) #print(result_box, frames[frame].rotated, frame) rect_on_big = big_image.crop(result_box) if frames[frame].rotated: rect_on_big = rect_on_big.transpose(Image.ROTATE_90) result_image.paste(rect_on_big) if not os.path.isdir(file_path): os.mkdir(file_path) outfile = (file_path+'/' + framename+'.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 boith plist and png files in the same directory"
將腳本命名為
用法:
例:
unpack_plist.py
,放在plist、png文件同級目錄中
用法:
python unpack_plist.py plist文件名稱
例:
python unpack_plist.py texture