最近做了一个需求,主要是对接一个公众号的活动部分,要求将前端传过来的相关数据生成一个带二维码的静态图片以便用户保存分享。经过一些搜索,最后决定使用Python的PIL(Pillow)包的Image, ImageFont, ImageDraw模块实现。
设计思路:由于是服务器端代码,希望图片都是在内存中,所以代码中对于存储图片都采用了BytesIO。好在Image.open()方法支持file-like的类型,所以用起来并不复杂。
随便做了一个(可以把你的设计师同事气到脑中风的)示例图,大致展示了这个项目可以提供的功能。
先放项目地址:https://github.com/HectorLI36/sharing_picture_generator
用法请见上面的GitHub里的README,本文详细说一下思路和注意事项,避免朋友们和我踩同样的坑。
下面说一下几个比较重要的模块。
1.生成二维码
这部分是相对来说比较简单的,只需要Python中的qrcode包即可。
import qrcode
qr_pil_obj = qrcode.make(url, border=0)
qr_code_pic = BytesIO()
qr_pil_obj.save(qr_code_pic, format='PNG')
参数 broder指的是二维码周围白圈的宽度,默认为4.
qrcode.make()方法返回的是一个PIL.Image对象。存成BytesIO以后,直接传到函数中就OK了。
2.设置字体对齐
PIL中ImageDraw模块的text()方法是在背景图片上用文本框的左上角定位的,但有时候我们需要文本居中,或文本的最后侧处于特定的位置,这就提出了一个问题。经过一番搜索,我决定自己算。。。
_font = ImageFont.truetype(*font_args, index