持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
前言
美工提供的图片可能只有一份标准的二倍图。而为了做到不求人,就拿到我们正常开发时候需要的一倍图+二倍图+三倍图。于是便萌生了使用脚本来实现图片的倍数处理。
环境准备
- 安装 python3.x ,当然 2.x 的也可以,但是文章中的代码是 3.x 的,所以如果是 2.x 的话,文章只供思路参考
- 安装 PIL,也就是 Pillow,如果没有下载的话,可以通过 pip 进行下载
pip3 install Pillow - 放有需要进行倍数缩放图片的文件夹
至此,环境已经准备完毕
思路讲解
首先列出主要任务:
- 主要目的是缩放图片,所以需要使用PIL中的 resize 方法,将图片大小进行缩放,
Image.BILINEAR代表用的是哪种算法; - 判断文件夹中的图片是否已经缩放过了,原理是根据缩放过的会含有@1x,@2x,@3x的字样,所以对包含这种名字的图片不进行处理即可;
- 遍历文件夹,并获得所有的图片,这里使用
glob.glob()方法获取所有符合要求的图片。(在这里偷懒了,就只找.png格式的图片)
把任务写出来了,接下来就是一点一点的完成模块:
缩放模块:
- 通过 PIL 打开图片,生成 Image 对象~(这里使用的图片是二倍图的大小,如果有三倍图是最好的,不过代码需要略微修改)~
ori_img = Image.open('image.png')
- 生成一倍图,只需将图片的宽和高各除二,并保存即可~(注意,size 是只支持 int 的,所以需要强转成 int 类型)~
new_img = ori_img.resize((int(ori_img.width/2),int(ori_img.height/2)),Image.BILINEAR)
new_img.save('image@1x.png')
- 生成三倍图,将原图片宽高各乘1.5并保存即可
new_img = ori_img.resize((int(ori_img.width*1.5),int(ori_img.height*1.5)),Image.BILINEAR)
new_img.save('image@3x.png')
- 重命名本身,作为二倍图保存
os.rename('image.png','image@2x.png')
判断模块:
- 列出所有需要屏蔽的字段,并写入元组中,这里需要屏蔽的是含有@1x,@2x,@3x的字样的文件名,可以根据自己的需求,增加屏蔽关键字
ignore_string = ['@1x','@2x','@3x']
- 编译所有的屏蔽字段,并判断是否在图片中
for name in ignore_string:
if name in file_name:
return False
遍历模块
- 一句话代码
png_files = glob.glob(r"*.png")
至此,思路已经讲解完毕,剩下的就是把代码拼在一起了
代码
# python3
from PIL import Image
import glob
import os, sys
# 扩展图片为1、2、3倍图
def scale_image(file_name,file_type):
ori_img = Image.open(file_name + '.' + file_type)
#一倍图
new_img = ori_img.resize((int(ori_img.width/2),int(ori_img.height/2)),Image.BILINEAR)
new_img.save(file_name + '@1x.' + file_type)
#三倍图
new_img = ori_img.resize((int(ori_img.width*1.5),int(ori_img.height*1.5)),Image.BILINEAR)
new_img.save(file_name + '@3x.' + file_type)
#二倍图重命名
try:
os.rename(file_name + '.' + file_type,file_name + '@2x.' + file_type)
except Exception:
print('重命名发生错误')
else:
pass
finally:
pass
# 是否是需要扩展的图片
def is_normal_image(file_name):
ignore_string = ['@1x','@2x','@3x']
# 如果自带@1x,@2x,@3x,则不需要进行扩展
for name in ignore_string:
if name in file_name:
return False
return True
png_files = glob.glob(r"*.png")
for img_file in png_files :
file_name = img_file[:-4]
if is_normal_image(file_name):
scale_image(file_name,'png')
else :
print(file_name)