教你用Python快速替换iOS项目应用图标

最近用Python写了一个简单的脚本,自动替换iOS项目里的Icon图片资源,记录一下完整的流程,想进行尝试的童鞋可以参考下。

demo路径

一、准备工作

巧妇难为无米之炊,作为一个程序员,没有🔨,我们怎么造🚀呢?

所以首先,我们要配置好Python环境

推荐使用pyenv来进行不同版本的安装及切换,以及虚拟环境的配置,用法参考

使用pip工具 来完成Python包的查找、下载、安装、卸载的功能,用法参考

开发工具可以自由选择,我使用的是vscode

二、目标分析及步骤拆分

首先来明确我们的目标,是要将传入的一张图片,设置成一个iOS项目工程的icons资源,

  • 第一步,我们要获取一张图片的路径,并判断是否是1024*1024大小(项目图片要求)

要设置iOS项目工程的icons资源,需要将项目工程要求的指定大小像素的图片存放到对应的路径,并配置好描述文件

  • 第二步,我们要将原图片进行压缩成各种大小的图片

  • 第三步,将这些图片存放到指定的路径下面,如果已存在则直接替换

  • 第四步,对描述文件进行配置

接下来我们来看看具体的实现

三、实现

1.依赖头文件导入

arduino 复制代码
import sys
import shutil
import json
import os

系统提供的工具库可以像上面一样直接引入,第三方库需要先使用pip进行下载 (注意如果使用虚拟环境,需要在对应环境进行下载, 否则会出现识别不到的问题)

复制代码
pip install Pillow

再进行头文件引入

javascript 复制代码
from PIL import Image

2.源图片读取

判断png格式

判断是否是png格式 复制代码
def is_png_file(file_name):
    if file_name.endswith(".png"):
        return True
    else:
        return False

获取图片尺寸,判断大小是否为1024*1024

获取图片尺寸,判断大小 复制代码
def check_image_size_1024(image_path):
    try:
        with Image.open(image_path) as img:
            width, height = img.size
            return width == 1024 and height == 1024
    except IOError:
        print(f"无法打开或读取图像文件: {image_path}")
        return False

3.图片压缩

将图片压缩成指定尺寸 复制代码
try:
    with Image.open(input_path) as img:
        # 获取图像原始尺寸
        original_width, original_height = img.size

        # 计算目标尺寸的缩放比例
        ratio = min(target_size[0] / original_width, target_size[1] / original_height)

        # 计算调整后的尺寸
        new_width = int(original_width * ratio)
        new_height = int(original_height * ratio)

        # 调整图像尺寸
        resized_img = img.resize((new_width, new_height), Image.LANCZOS)
    except IOError:
        print(f"无法打开或读取图像文件: {input_path}")
    except Exception as e:
        print(f"处理图像时出现错误: {e}")

4.图片写入,如果存在则替换

将目标图片存储到指定位置 复制代码
targetImageSize = imageSizeInfo[0] * imageSizeInfo[1]
targetImageSuffix = ".png" if imageSizeInfo[1] == 1 else "@{0}x.png".format(imageSizeInfo[1])
targetIconName = '{0}-iphone{1}'.format(imageSizeInfo[0],targetImageSuffix)
targetIconPath =  os.path.join(targetAppIconAssetsPath, targetIconName)
resized_img.save(targetIconPath)

注意需要将对应的iphone、ipad、appStore所需图片都进行一次处理

5.图片描述文件修改

描述文件内容读取

读取json文件 复制代码
targetAppIconAssetsJsonPath = os.path.join(targetAppIconAssetsPath, "Contents.json")
with open(targetAppIconAssetsJsonPath, "r+") as file:
    contents = file.read()
jsonData = json.loads(contents)

图片配置信息内容,需要对每个图片进行配置

将图片的配置内容信息写入到json内容中 复制代码
newImagesJsonInfo = []
newImagesJsonInfo.append({
            "size" : '{0}x{1}'.format(imageSizeInfo[0],imageSizeInfo[0]),
            "idiom" : "ipad",
            "filename" : targetIconName,
            "scale" : "{}x".format(imageSizeInfo[1]),
            })
            ...
            ...

修改配置文件内容并进行存储

修改json文件,完成写入 复制代码
jsonData['images'] = newImagesJsonInfo
modified_content = json.dumps(jsonData, indent=2)
with open(targetAppIconAssetsJsonPath, "w") as file:
    file.write(modified_content)

这样icon资源就都已经配置好了

四、命令行配置

可以使用shuttle工具完成配置,一键触发

在.libsonnet文件中新增用于触发脚本的方法,供.jsonnet文件调用

ini 复制代码
// 替换项目icons
replaceXcodeIconsCommand(
    script_path,
    iOS_project_path,
    inTerminal='new',
):: {
    local name = '更改AppIcon',
    local title = '替换项目Icons',
    cmd: "cd %s; python auto_replace_icon.py -p %s" % [script_path, iOS_project_path],
    inTerminal: inTerminal,
    name: name,
    title: title,
},

在上面的方法中传入shuttle代码路径和需要替换的项目路径

然后在.jsonnet文件里在想要的地方添加触发事件就阔以啦

相关推荐
像风一样自由202012 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
青少儿编程课堂12 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
田里的水稻12 小时前
FA_CNN卷积神经网络十八---感知机到多层感知机PyTorch
人工智能·pytorch·python
終不似少年遊*13 小时前
【Skill】为中型研发团队制作的敏捷迭代AI副驾Skill
人工智能·python·华为云·agent·ai编程·skill
呆萌的代Ma13 小时前
python使用ThreadPoolExecutor自带队列将多线程变串行执行
python
echome88813 小时前
Python 正则表达式:5 个日常够用的模式
python·正则表达式
吴名氏.13 小时前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
青少儿编程课堂13 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
Eiceblue13 小时前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word
Android小码家13 小时前
framework&framework-minus-apex&android.jar的区别
android·python·jar