用python快速做一个国庆头像

又到了一年一度的国庆假期七天乐,互联网公司的 IT 小能手们,终于又回到久违的家中,立即变身父母的乖宝、另一半的臭宝,或是小宝们的超级奶妈奶爸;现代社会的节奏就是这样快,彷佛头一天还忙忙碌碌的对需求、过排期、写代码的生活已经恍若隔世一般了。
大部分的人的假期安排其实也不复杂,就是那句能瞬间激活小孩和狗的魔法口令 -- 出去玩!
不管是惬意的郊游、热闹的街头,还是人头攒动的景区,掏出手机咔咔一通的自拍合影是必不可少的了。
这时家里的老人可能会提出一个需求 -- 把自拍或家庭合影的手机照片做成微信头像。
随着智能手机和微信在中老年群体中的普及,这样的需求往往是大概率甚至高频的,一个好的微信头像,既能彰显家庭的和睦幸福,也能在国画班、广场舞天团中收获艳羡的目光。
但一个小问题随之产生 -- 微信默认的头像处理界面,只能截取手机照片的一个正方形区域,而无法保留全部图片,这可能造成家庭合影无法完整呈现的问题。

微信默认的头像处理
要是能将手机照片自动放置到一个正方形区域中,并且用颜色相近的模糊效果填充背景,那就好了~
比如下面的照片:

原图
如果做成我们期望的效果,再加个圆形小效果,多好!

期望的效果
如果用 PS 一张张处理图片,一来太麻烦,二来大部分人也搞不来。还好这年头互联网公司中,无论是专业的程序员还是产品经理、运营、测试的同学,好像人人都会写点 SQL 或 Python 啥的,这不就成了嘛~
说干就干,请出懒人小助手 Python 君,用不了几行代码就能达到我们的效果!
新建一个 circle.py 文件:
import os
import re
import sys
from PIL import Image, ImageFilter, ImageDraw, ImageOps
首先引入了一些系统库和 PIL,这是 Python 平台最常用的图片处理工具集,算得上事实上的图像处理标准库了。
但由于 PIL 本身仅支持到 Python 2.7,我们可以直接安装叫做 pillow 的兼容版本,既支持最新的 Python 3.x,又加入了许多新特性,用下面的命令就可以安装了:
pip3 install pillow
然后来声明一个函数:
def make_circle(path, maxS = 600):
foreImg = Image.open(path)
if foreImg.mode in ("RGBA", "P"):
foreImg = foreImg.convert('RGB')
h,w = foreImg.size
maxSize = max(h, w)
imgPosi = (int((maxSize - h) / 2), int((maxSize - w) / 2))
bgBlur = ImageFilter.GaussianBlur(radius=6.18)
bgSize = (maxSize, maxSize)
backImg = foreImg.copy()
backImg = backImg.resize(bgSize)
backImg = backImg.filter(bgBlur)
backImg.paste(foreImg, imgPosi)
mask = Image.new('L', bgSize, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0) + bgSize, fill=255)
backImg = ImageOps.fit(backImg, mask.size, centering=(0.5, 0.5))
backImg.putalpha(mask)
if maxSize > maxS:
backImg = backImg.resize((maxS, maxS))
return backImg
这几行简短的代码比较清晰,基本就是按我们期望的顺序处理了目标路径的图片,相关的 API 查询 pillow 的文档即可,就不过多赘述了。
file_name = sys.argv[1]
save_name = re.sub(r'(jpg|jpeg)$', 'png', file_name.lower())
img = make_circle('./' + file_name)
img.save('./circle_' + save_name)
最后几行是让程序接收命令行传入的文件名参数并执行处理函数的。
只需在终端中执行这样一条命令:
python3 circle.py 1.jpg
就能立即得到一张处理好的头像图片啦,方便又实用!

另外,在视频号“云前端”的系列视频“编程术语古典史”中,涉及希腊神话中众神的头像,也是用这个 Python 函数一键生成的哦,欢迎大家围观转发!
