Python 解析 .plist 文件,并重组为新的图片


原图片(尺寸:200*200)

file

.plist 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>frames</key>
		<dict>
			<key>test_000.png</key>
			<dict>
				<key>frame</key>
				<string>{{0,100},{100,100}}</string>
				<key>offset</key>
				<string>{0,0}</string>
				<key>rotated</key>
				<false/>
				<key>sourceColorRect</key>
				<string>{{0,0},{100,100}}</string>
				<key>sourceSize</key>
				<string>{100,100}</string>
			</dict>

			<key>test_001.png</key>
			<dict>
				<key>frame</key>
				<string>{{100,100},{100,100}}</string>
				<key>offset</key>
				<string>{0,0}</string>
				<key>rotated</key>
				<false/>
				<key>sourceColorRect</key>
				<string>{{0,0},{100,100}}</string>
				<key>sourceSize</key>
				<string>{100,100}</string>
			</dict>

			<key>test_002.png</key>
			<dict>
				<key>frame</key>
				<string>{{100,0},{100,100}}</string>
				<key>offset</key>
				<string>{0,0}</string>
				<key>rotated</key>
				<false/>
				<key>sourceColorRect</key>
				<string>{{0,0},{100,100}}</string>
				<key>sourceSize</key>
				<string>{100,100}</string>
			</dict>

			<key>test_003.png</key>
			<dict>
				<key>frame</key>
				<string>{{0,0},{100,100}}</string>
				<key>offset</key>
				<string>{0,0}</string>
				<key>rotated</key>
				<false/>
				<key>sourceColorRect</key>
				<string>{{0,0},{100,100}}</string>
				<key>sourceSize</key>
				<string>{100,100}</string>
			</dict>
		</dict>

		<key>metadata</key>
		<dict>
			<key>format</key>
			<integer>2</integer>
			<key>size</key>
			<string>{200,200}</string>
			<key>textureFileName</key>
			<string>test.png</string>
			</dict>
		</dict>
</plist>

python 代码

import plistlib
from PIL import Image

def handle_image():
    # 读取 .plist 文件
    with open('test.plist', 'rb') as f:
        plist_data = plistlib.load(f)

    # 输出plist
    print(plist_data['frames'])

    # 打开原始图片
    original_image = Image.open('test.png')

    # 创建一个新的空白图片,用于合并结果
    merged_image = Image.new('RGBA', (100 * 4, 100))

    count = 0
    last_x = -1
    last_y = -1
    for k, v in plist_data['frames'].items():
        posi_str = str(v['frame'])  # 获取表示位置的str
        posi_rect = posi_str.replace('{', '').replace('}', '').split(',')
        width = int(posi_rect[3] if v['rotated'] else posi_rect[2])
        height = int(posi_rect[2] if v['rotated'] else posi_rect[3])

        print("%s count: %d --- (%d : %d)" % (k, count, int(posi_rect[0]), int(posi_rect[1])))

        x, y, width, height = int(posi_rect[0]), int(posi_rect[1]), width, height
        if x == last_x and y == last_y:
            continue
        image_part = original_image.crop((x, y, x + width, y + height))
        merged_image.paste(image_part, (count * 100, 0))
        last_x = x
        last_y = y
        count += 1

    # 保存合并后的图片
    merged_image.save('merged_image_test.png')


if __name__ == '__main__':
    # print_hi('PyCharm')
    handle_image()

新图片

file