首页 > 编程语言 >python拆分带plist的png图片

python拆分带plist的png图片

时间:2024-11-26 16:15:16浏览次数:9  
标签:python frame replace item result plist png

参考:https://www.cnblogs.com/creator-star/p/13926602.html

上面的参考的脚本只能拆分2代的. plist中metadata的format的值2

现有plist版本为3, 所以修改了下, 需要安装pillow库的

#需要安装pillow库
#pip3 install pillow
import plistlib
import os
import sys
from PIL import Image


def export_image(img, pathname, item):
    # 去透明后的子图矩形
    x, y, w, h = tuple(map(int, item['frame']))
    # 子图原始大小
    size = tuple(map(int, item['sourceSize']))
    # 子图在原始图片中的偏移
    ox, oy, _, _ = tuple(map(int, item['sourceColorRect']))

    # 获取子图左上角,右下角
    if item['rotated']:
        box = (x, y, x + h, y + w)
    else:
        box = (x, y, x + w, y + h)

    # 使用原始大小创建图像,全透明
    image = Image.new('RGBA', size, (0, 0, 0, 0))
    # 从图集中裁剪出子图
    sprite = img.crop(box)

    # rotated纹理旋转90度
    if item['rotated']:
        sprite = sprite.transpose(Image.ROTATE_90)

    # 粘贴子图,设置偏移
    image.paste(sprite, (ox, oy))

    # 保存到文件
    print('保存文件:%s' % pathname)
    image.save(pathname, 'png')

# 获取 frame 参数
def get_frame(frame):
    result = {}
    if 'frame' in frame:
        result['frame'] = frame['frame'].replace('}', '').replace('{', '').split(',')
        result['sourceSize'] = frame['sourceSize'].replace('}', '').replace('{', '').split(',')
        result['sourceColorRect'] = frame['sourceColorRect'].replace('}', '').replace('{', '').split(',')
        result['rotated'] = frame['rotated']
    elif 'aliases' in frame:
        result['frame'] = frame['textureRect'].replace('}', '').replace('{', '').split(',')
        result['sourceSize'] = frame['spriteSourceSize'].replace('}', '').replace('{', '').split(',')
        result['sourceColorRect'] = [0, 0, 0, 0]
        result['rotated'] = frame['textureRotated']
    return result

# 生成图片
def gen_image(file_name, export_path):
    # 检查文件是否存在
    plist = file_name + '.plist'
    if not os.path.exists(plist):
        print('plist文件【%s】不存在!请检查' % plist)
        return

    png = file_name + '.png'
    if not os.path.exists(png):
        print('png文件【%s】不存在!请检查' % plist)
        return

    # 检查导出目录
    if not os.path.exists(export_path):
        try:
            os.mkdir(export_path)
        except Exception as e:
            print(e)
            return

    # 使用plistlib库加载 plist 文件
    lp = plistlib.load(open(plist, 'rb'))
    # 加载 png 图片文件
    img = Image.open(file_name + '.png')

    # 读取所有小图数据
    frames = lp['frames']
    for key in frames:
        item = get_frame(frames[key])
        export_image(img, os.path.join(export_path, key), item)


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    if len(sys.argv) == 3:
        #要拆的文件(不带扩展名)
        filename = sys.argv[1]
        #导出的目录
        exportPath = sys.argv[2]
        gen_image(filename, exportPath)
    #文件不带.plist与.png(test.png拆分时, 应该传入test)
    #filename = r"C:\Users\Administrator\Desktop\plist\Table_Records\Table_Records"
    #exportPath = r"C:\Users\Administrator\Desktop\plist\Table_Records\new"
    #gen_image(filename, exportPath)

 

标签:python,frame,replace,item,result,plist,png
From: https://www.cnblogs.com/barrysgy/p/18570381

相关文章

  • 学习Python Day11
    函数1.1定义函数def函数名(参数):    代码1    代码21.2调用函数函数名(参数) 在Python中,函数必须先定义,后调用2.函数参数形参:定义函数时,括号中的参数实参:调用函数时,括号中的参数位置参数:调用函数时按照形参的位置来传递参数关键字参数:用"键......
  • 《python二维码识别系统》毕业设计项目
    大家好,我是陈辰学长,一名在Java圈辛勤劳作的码农。今日要和大家分享的是一款《python二维码识别系统》毕业设计项目。项目源码以及部署相关事宜,请联系陈辰学长,文末会附上联系信息哦。......
  • Python的textwrap库:文本包装的艺术,让你的文本焕然一新,解锁文本排版的无限可能!
    ......
  • python将Xmind用例转为Excel用例
     代码:#coding=utf-8importxlwtfrompast.builtinsimportraw_inputfromxmindparserimportxmind_to_dictdefresolvePath(dict,lists,title):#title去除首尾空格title=title.strip()#如果title是空字符串,则直接获取valueiflen(title)......
  • Python_异步编程-并发编程-协程和future
    操作系统创建线程Unix进程的设计思想,实现了forkexecwaitexit四个精巧的系统调用来支持对进程的灵活管理。父进程进程通过fork系统调用创建自身的副本(子进程);称为“子进程”的副本可调用exec系统调用用另一个程序覆盖其内存空间,这样就可以执行新程序了;......
  • Python处理时间汇总-与时区相关的处理
    获取当前东八区时间以及统一时区的时间比较#coding:utf-8importpytzimportdatetime#定义东八区时区cst_timezone=pytz.timezone('Asia/Shanghai')#获取东八区的当前时间defget_cst_nowtime():returndatetime.datetime.now(cst_timezone)#将时间对象......
  • 你会PHP、JAVA、Python或GO吗?都有做过哪些应用呢?
    PHP、Java、Python和Go都是广泛应用的编程语言,它们各自在不同的领域和场景中发挥着重要的作用。以下是它们各自的一些典型应用:PHPPHP是一种流行的服务器端脚本语言,特别适用于Web开发。以下是PHP的一些主要应用:电商:PHP是亚马逊网站的服务器端语言,用于处理订单、客户管理和产品......
  • Python中的map函数
    Python中的map函数是一种常用的高雅实现,它能够在不使用第三方库的情况下对一个列表进行映射,并返回一个新的列表。map函数不仅能够提高Python代码的可读性,还能够拓展Python的功能,使其成为一种强大的数据处理工具。Python中的map函数在Python中,map函数是map函数的别名。它是......
  • python连接操作oss对象存储
    用python调试一下oss对象存储。一开始用的oss2库,发现不行。用boto3库才可以,说明我的对象存储是和AWS兼容的,并不是基于阿里的oss.importboto3frombotocore.exceptionsimportNoCredentialsError,PartialCredentialsError#设置您的AccessKey和SecretKeyaccess_key_id......
  • 理解 Python 作用域和命名空间
    在学习Python编程时,掌握作用域(Scope)和命名空间(Namespace)这两个关键概念是非常重要的。这不仅能帮助你更好地理解变量的生命周期与可见性,还能提高你编写高质量代码的能力。本文将深入探讨这两者的含义、区别以及如何在实际编码中应用。什么是命名空间?命名空间是一个存储变量......