写了一个简单的脚本,自动替换iOS项目里的Icon图片资源,记录一下完整的流程,想进行尝试的童鞋可以参考下。
一、准备工作
巧妇难为无米之炊,作为一个程序员,没有🔨,我们怎么造🚀呢?
所以首先,我们要配置好Python
环境
推荐使用pyenv
来进行不同版本的安装及切换,以及虚拟环境的配置,用法参考
使用pip
工具 来完成Python
包的查找、下载、安装、卸载的功能,用法参考
开发工具可以自由选择,我使用的是vscode
二、目标分析及步骤拆分
首先来明确我们的目标,是要将传入的一张图片,设置成一个iOS项目工程的icons资源,
- 第一步,我们要获取一张图片的路径,并判断是否是1024*1024大小(项目图片要求)
要设置iOS项目工程的icons资源,需要将项目工程要求的指定大小像素的图片存放到对应的路径,并配置好描述文件
- 第二步,我们要将原图片进行压缩成各种大小的图片
- 第三步,将这些图片存放到指定的路径下面,如果已存在则直接替换
- 第四步,对描述文件进行配置
接下来我们来看看具体的实现
三、实现
1.依赖头文件导入
import sys
import shutil
import json
import os
系统提供的工具库可以像上面一样直接引入,第三方库需要先使用pip
进行下载 (注意如果使用虚拟环境,需要在对应环境进行下载, 否则会出现识别不到的问题)
pip install Pillow
再进行头文件引入
from PIL import Image
2.源图片读取
判断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.图片描述文件修改
描述文件内容读取
targetAppIconAssetsJsonPath = os.path.join(targetAppIconAssetsPath, "Contents.json")
with open(targetAppIconAssetsJsonPath, "r+") as file:
contents = file.read()
jsonData = json.loads(contents)
图片配置信息内容,需要对每个图片进行配置
newImagesJsonInfo = []
newImagesJsonInfo.append({
"size" : '{0}x{1}'.format(imageSizeInfo[0],imageSizeInfo[0]),
"idiom" : "ipad",
"filename" : targetIconName,
"scale" : "{}x".format(imageSizeInfo[1]),
})
...
...
修改配置文件内容并进行存储
jsonData['images'] = newImagesJsonInfo
modified_content = json.dumps(jsonData, indent=2)
with open(targetAppIconAssetsJsonPath, "w") as file:
file.write(modified_content)
这样icon资源就都已经配置好了
四、命令行配置
可以使用shuttle工具完成配置,一键触发
在.libsonnet文件中新增用于触发脚本的方法,供.jsonnet文件调用
// 替换项目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文件里在想要的地方添加触发事件就阔以啦