[python] plist atlas split

1. Those who use cocos creator can go to the official store to find the corresponding plug-in tool, but it is not free... :( , link address: cocos creator combined image split

2. It is easier to use cocos studio, directly create a new project and import the plist file, enter the folder where the file is located, see a hidden folder, and enter it is what you want. Reference link: cocos studio image split

3. Use python's PIL image processing module to split:

(1) Install python, this is Baidu, the method is simple.

(2) Install python's PIL module:

pip install Pillow

(3) Code part:

          split.py

#!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 == '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():  
        rectlist = to_list(v['frame'])  
        width = int( rectlist[3] if v['rotated'] else rectlist[2] )  
        height = int( rectlist[2] if v['rotated'] else rectlist[3] )  
        box=(   
            int(rectlist[0]),  
            int(rectlist[1]),  
            int(rectlist[0]) + width,  
            int(rectlist[1]) + height,  
            )  
        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,  
        #        ( 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  
            )  
        print(rect_on_big, result_box)
        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(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")

(4) Put the plist files and pictures that need to be split in the same directory as the script

 (5) Run the split script:

python split.py block

A folder can be generated in the current directory, which contains all the pictures in the plist

 

Guess you like

Origin blog.csdn.net/sirria1/article/details/127772251