目的
公司的UI用的工具是figma,图片资源下载后,通常是这样的:
但当导入到我们的Flutter项目时,由于分一倍图、二倍图和三倍图需要分不同文件夹保存,而且还需将命名改为一致,手动操作实在是麻烦,所以如果我们写个脚本就可以帮我们省去这些繁琐的工作。
脚本代码
# 导入必要的库:os库和PIL库
import os
from PIL import Image
# 获取当前工作目录路径并创建目标文件夹"a_img",以及其下的两个子文件夹"2.0x"和"3.0x"。
src_folder = os.getcwd()
dst_folder = os.path.join(src_folder, 'a_img')
os.makedirs(dst_folder, exist_ok=True)
os.makedirs(os.path.join(dst_folder, '2.0x'), exist_ok=True)
os.makedirs(os.path.join(dst_folder, '3.0x'), exist_ok=True)
# 使用os.walk函数遍历当前工作目录下的所有文件夹,对于不在目标文件夹"a_img"及其子文件夹中的文件夹,获取文件夹名并存储在new_name变量中。
for foldername, subfolders, filenames in os.walk(src_folder):
if foldername == dst_folder or 'img' in foldername:
continue
# 将文件夹的名字保存,用于重命名三张图片
new_name = os.path.basename(foldername)
# 对于文件夹中的PNG图像文件,重命名为"new_name.png"并将它们移动到目标文件夹"a_img"及其子文件夹中。
for filename in filenames:
if not filename.endswith('.png'):
continue
basename, extension = os.path.splitext(filename)
src_path = os.path.join(foldername, filename)
if '@2x' in basename:
dst_path = os.path.join(dst_folder, '2.0x', new_name + '.png')
elif '@3x' in basename:
dst_path = os.path.join(dst_folder, '3.0x', new_name + '.png')
else:
dst_path = os.path.join(dst_folder, new_name + '.png')
os.rename(src_path, dst_path)
# 使用PIL库将这些PNG图像文件转换为WebP格式
im = Image.open(dst_path)
webp_path = os.path.splitext(dst_path)[0] + '.webp'
im.save(webp_path, 'webp')
# 并将原始的PNG图像文件删除
os.remove(dst_path)
运行脚本,得到如下:
之后我们将图片复制到项目中后,再运行第二个脚本,将本地的这些图片删除。
import os
import shutil
# 获取当前脚本所在目录的绝对路径
script_path = os.path.dirname(os.path.abspath(__file__))
print(f"Script path: {script_path}")
# 获取a_img文件夹的路径
img_path = os.path.join(script_path, "a_img")
print(f"Image path: {img_path}")
# 遍历a_img文件夹及其子文件夹内的所有文件
deleted_files = []
for root, dirs, files in os.walk(img_path):
for file in files:
# 判断文件是否是图片文件
if file.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp')):
# 拼接文件的完整路径
file_path = os.path.join(root, file)
print(f"Deleting file: {file_path}")
# 删除文件
os.remove(file_path)
deleted_files.append(os.path.splitext(file)[0])
# 获取a_img文件夹所在目录的路径
parent_path = os.path.abspath(os.path.join(img_path, os.pardir))
# 遍历a_img所在目录中的文件夹
for dir_name in os.listdir(parent_path):
dir_path = os.path.join(parent_path, dir_name)
# 判断该文件夹是否与a_img删除的图片同名
if dir_name in deleted_files:
print(f"Deleting directory: {dir_path}")
# 删除该文件夹及其子文件夹
shutil.rmtree(dir_path)