mac 使用 python 实现生成 iOS 倍数图

562 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

前言

美工提供的图片可能只有一份标准的二倍图。而为了做到不求人,就拿到我们正常开发时候需要的一倍图+二倍图+三倍图。于是便萌生了使用脚本来实现图片的倍数处理。

环境准备

  1. 安装 python3.x ,当然 2.x 的也可以,但是文章中的代码是 3.x 的,所以如果是 2.x 的话,文章只供思路参考
  2. 安装 PIL,也就是 Pillow,如果没有下载的话,可以通过 pip 进行下载 pip3 install Pillow
  3. 放有需要进行倍数缩放图片的文件夹
至此,环境已经准备完毕

思路讲解

首先列出主要任务:

  1. 主要目的是缩放图片,所以需要使用PIL中的 resize 方法,将图片大小进行缩放,Image.BILINEAR代表用的是哪种算法;
  2. 判断文件夹中的图片是否已经缩放过了,原理是根据缩放过的会含有@1x,@2x,@3x的字样,所以对包含这种名字的图片不进行处理即可;
  3. 遍历文件夹,并获得所有的图片,这里使用glob.glob()方法获取所有符合要求的图片。(在这里偷懒了,就只找.png格式的图片)

把任务写出来了,接下来就是一点一点的完成模块:

缩放模块:
  1. 通过 PIL 打开图片,生成 Image 对象~(这里使用的图片是二倍图的大小,如果有三倍图是最好的,不过代码需要略微修改)~
ori_img = Image.open('image.png')
  1. 生成一倍图,只需将图片的宽和高各除二,并保存即可~(注意,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. 生成三倍图,将原图片宽高各乘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')
  1. 重命名本身,作为二倍图保存
    os.rename('image.png','image@2x.png')
判断模块:
  1. 列出所有需要屏蔽的字段,并写入元组中,这里需要屏蔽的是含有@1x,@2x,@3x的字样的文件名,可以根据自己的需求,增加屏蔽关键字
ignore_string = ['@1x','@2x','@3x']
  1. 编译所有的屏蔽字段,并判断是否在图片中
    for name in ignore_string:
        if name in file_name:
            return False
遍历模块
  1. 一句话代码
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)