Как я могу извлечь png изображения из файлов plist? - PullRequest
0 голосов
/ 22 мая 2011

В настоящее время у меня есть набор файлов plist. Внутри находятся PNG изображения, некоторые файлы имеют множество изображений. Я использую Win64 Vista.

Я искал вещи специально для этого, такие как FileJuicer, но это только для пользователей Mac.

Ответы [ 5 ]

3 голосов
/ 13 августа 2012

Я написал этот сценарий для распаковки png файлов в plist файле, упакованном TexturePacker

Сначала убедитесь, что файлы png и plist находятся в одном каталоге, в моем случае: freeGifts.plist и freeGifts.png

Во-вторых, такой же следующий скрипт как unpack_plist.py

Затем, python unpack_plist.py freeGifts, он сгенерирует множество файлов png в каталог с именем freeGifts

Требование: питон, PIL

#! /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():
        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)
        result_image = Image.new('RGBA', sizelist, (0,0,0,0))
        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 v['rotated']:
            result_image = result_image.rotate(90)
        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"
0 голосов
/ 01 июня 2016

Если у вас есть JRE на вашем компьютере или вы можете установить его, вы можете использовать инструмент, который я создаю, чтобы распаковать файл .plist.Он также поддерживает .pack-файл, который используется в проектах LibGdx, и .xml-файл, используемый во многих движках, таких как Unity для упаковки текстур.

https://github.com/itsabhiaryan/TextureUnPacker

0 голосов
/ 26 октября 2013

Благодаря Sean.Z.first.
Но я обнаружил, что поворот не очень хорош, и патч ygweric недостаточно хорош.
, потому что он потерпит неудачу, когда png включает файл jpg (режим P).и иногда прозрачный будет черным фоном.
Я пытаюсь исправить это и мой код, как показано ниже:

    #! /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():
            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
                    )
            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"
0 голосов
/ 24 июля 2013

Благодаря Sean.Z.
для unpack_plist.py вам нужно:
1: PIL был установлен на вашем компьютере.
2: используйте Python 2.5
python2.5 unpack_plist.py birdfly
или у вас ничего не получится.
----- 2013-07-25--
для некоторого plist, который вращается, вышеупомянутый скрипт может иметь некоторые ошибки. я изменяю это следующим образом:



#python2.5 unpack_plist.py birdfly 


#! /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"
        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)
        '''
        result_image = Image.new('RGBA', sizelist, (0,0,0,0))
        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 v['rotated']:
            result_image = result_image.rotate(90)
        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 v['rotated']:
            rect_on_big = rect_on_big.rotate(90)
        if not os.path.isdir(file_path):
            os.mkdir(file_path)
        outfile = (file_path+'/' + k).replace('gift_', '')

        rect_on_big.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 голосов
/ 22 мая 2011

Лол, это все, что делает Стив Джобс.Вы можете проанализировать plist в C #, используя библиотеку ChadBurggraf https://github.com/ChadBurggraf/plists-cs. Но, как обсуждалось в комментариях, нужные вам файлы, вероятно, отсутствуют в файле plist.

...