完整源码可在公众号:「01二进制」后台回复:「海报生成器」获取html
最近自闭了一段时间,仔细思考一番后仍是决定要把本身心中所想坚持下去。今天来分享一个平常生活中常常见到,可是制做起来又可能会一时没有思路的东西,主要功能就是生成带二维码的卡片或者海报。python
以前莫名其妙的被导师安排负责管理实验室的头条号,任务不难,就是接收实验室学长学姐翻译转述的论文,而后再发布到今日头条的头条号上,最后再生成以下所示的宣传图便可:markdown
当时以为,不就是发发文章,而后再用ps作个图这么简单吗。可接手以后才发现我毕竟图样图森破啊,从去年11月我开始发文章到今天,期间从未有一天断过,可是这头条号的编辑器也从未更新过,一个这么大的自媒体企业,文章的编辑器居然烂的跟坨💩同样,不支持外部图片,不支持markdown,不支持数学公式,不支持多级标题。(别跟我说什么能够把markdown转成html而后再复制进头条号的编辑器里面,样式都变成鬼了)编辑器
扯远了扯远了,回到正题。以前这么多天实现上述须要的主要流程以下:工具
在经历了100天上述这样重复的操做以后,我厌烦了。难道就没有一个工具可让我只输入文章连接和标题就自动生成海报的吗?post
苦苦寻觅半天无果,也罢,有条件要上,没条件创造条件也要上。没有现成的轮子,那就只能本身打造一个了,Python无疑是开发这个小工具的首选。字体
通常用于推广的海报或卡片样式都差很少,须要改变的主要就是二维码,因此只须要准备好海报的背景图,而后根据用户提供的二维码,将其贴在海报指定的位置上便可。优化
这次实验的项目结构以下:网站
assets文件夹中包含一些资源文件,例如
msyhl.ttc(字体文件)
、template.jpg(背景模版图片)
。output是生成的海报存放的路径url
本次生成二维码依赖于 PIL 模块和 qrcode 库,官方地址为:https://pypi.org/project/qrcode/5.1/,这里不解释用法,感兴趣的本身去官方文档下了解。这里就直接上代码了,具体代码的用意详见注释:
# 生成一个带logo的二维码
def generateQRCode(url):
# 初始化
qr = qrcode.QRCode(
version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8)
# 添加内容
qr.add_data(url)
qr.make(fit=True)
img = qr.make_image()
img = img.convert("RGBA")
# 读取logo
icon = Image.open("assets/logo.jpg")
# 设置logo
img_w, img_h = img.size
factor = 4
size_w = int(img_w / factor)
size_h = int(img_h / factor)
icon_w, icon_h = icon.size
if icon_w > size_w:
icon_w = size_w
if icon_h > size_h:
icon_h = size_h
icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
# 将logo并入原二维码中
w = int((img_w - icon_w)/2)
h = int((img_h - icon_h)/2)
icon = icon.convert("RGBA")
img.paste(icon, (w, h), icon)
rgb_im = img.convert('RGB')
# 保存到指定路径下
today = datetime.date.today()
folder_path = 'output/'+str(today)
mkdir(folder_path)
rgb_im.save(folder_path+'/qr.jpg')
复制代码
咱们先来梳理下,想要生成一张知足咱们需求的海报须要哪些元素:
换一种方式呈现代码,推荐一个将代码转换成图片的美化工具Carbonize
其实仔细阅读过这段代码以后才以为总体的思路一目了然:先读取须要的素材文件(二维码、标题),而后将素材粘贴到背景图片的指定位置。惟一复杂点的就是要找到一个合适的粘贴点,这个没办法,只能本身去试。
完整源码可在公众号:「01二进制」后台回复:「海报生成器」获取
这里有点我要提下,就是利用PIL
更改图片大小那块,也就是postPic.thumbnail((width/1.5, height/1.5))
这个地方,其实PIL中还有一个方法叫作resize
也是用来更改图片的大小的,那二者有何区别呢?
使用PIL生成缩略图用两种方式,resize
和thumbnail
,区别在于使用reszie
会返回一个新对象, 而使用thumbnail
则会在原对象上进行修改,即thumbnail
会覆盖原图。
>>> from PIL import Image
>>> im = Image.open('a.jpg')
>>> im.size # 原图尺寸
(3264, 2448)
>>> id(im)
140253860921640
>>> resize_im = im.resize((100,100))
>>> resize_im
<PIL.Image.Image image mode=RGB size=100x100 at 0x7F8F65A0A518>
>>> id(resize_im)
140253862077720
>>> thumb_im = im.thumbnail((100, 100))
>>> thumb_im
>>> im.size # 使用thumbnail后的原图尺寸改变,resize后的结果不必定等于指定的尺寸,由于是按比例缩放的
(100, 75)
复制代码