最近参加了老男孩的一个python训练营,里面某项任务是要求在某个海报模板上批量添加姓名和二维码,生成类似下图的海报。

图中我用红色方框标记的是需要修改的地方,先来聊下自己的思路:
1.要进行图片操作,要用到pillow模块,可以直接进行文字的添加和图片的合成
2.生成二维码可以用qrcode模块
3.比较麻烦和没有头绪的是怎么去对文字定位,最后借助了PS,下文具体表述。

第一步:
因为自己会点PS,所以先对原图进行了修改,将二维码和姓名直接删掉,没有PS的小伙伴直接用手机上的软化也可以完成,之后保存为海报的模板文件,如下:

第二步,导入模块,第一行是与Pillow有关的模块,第二行是二维码的模块,至于os模块,后文表述

from PIL import Image, ImageDraw, ImageFont
import qrcode
import os

第三步,定义函数,进行图片操作,这里主要用到了打开图片文件、添加文字、保存文件等几个操作

def poster(path, str1):'''path:海报模板文件路径添加的文字'''png1 = Image.open(path) #打开文件draw = ImageDraw.Draw(png1)font = ImageFont.truetype(r"C:\Windows\Fonts\STFANGSO.ttf", 40, encoding="utf-8")  # 设置字体draw.text((190, 300), str1, font=font, fill='black')  # 添加文字img_name = str1 + '.jpg'  # 海报名称 png1.save(img_name)  # 保存海报

path:模板文件的路径
str1:要添加的文字
需要注意的是:
1)第6行文件路径可以是相对路径
2)第7行进行添加文字操作
3)第8行设置字体,其中添加的路径是电脑上的绝对路径,需要注意是字体ttf文件的文件名最好在字体文件中文件的属性中查找,否则有可能一直报错找不到文件,如下图所示,40表示字号,可以调整,最后是编码方式,要添加英文的话可以不写,但是中文可能会报错

4)第9行是文字添加,注意第一个参数是添加的位置元组,是指的文字的左上角位置,就是下图画圈的地方,图片左上角的位置是(0,0)第一个参数是横坐标,第二个参数是纵坐标

5)第10行和11行是保存生成的图片

这里很多人会不清楚坐标的怎么确定,比较笨的方法就是一点点试一试,自己比较懒,所以查了下,可以用PS精确确定位置。
1),打开PS-窗口-信息,如下图所示:

2)按crtl+R调出标尺,在标尺上右键选择像素:

3)此时信息面板显示的鼠标所在位置就是精确的坐标了。

第四步,生成二维码图片,这个是相对比较简单的,代码如下:

QR_name = 'code.jpg'  # 二维码名称
QR_code = qrcode.make(str1)  # 生成二维码
QR_code.save(QR_name)  # 保存二维码

str1:为添加到二维码中的内容,因为需求里面没有二维码内容的要求,所以用添加的名称作为内容;需求里面并没有需要二维码文件,所以把要保存的二维码名称写死了,这样每次生成新的海报时,都会覆盖原有的二维码图片,好处就是最终完成后,只有最后一个二维码图片

第五步,重新打开二维码图片,与添加文字后的海报合成,代码如下:

png_QR = Image.open(QR_name)  # 重新打开二维码图片
png1.paste(png_QR, (35, 595))  # 添加到海报上
png1.save(img_name)  # 保存海报

这里用到了paste()方法,第一个参数是要添加上图片,也就是二维码图片,第二个参数是坐标元组,同样的确定坐标的方法同上。
其实写到这里基本的代码就完成了,但是实际测试中生成的二维码尺寸偏大,所以这里需要调整大小,pillow中有两种方法改变大小,分别是resize和thumbnail,两种方法都可以改变大小,但区别是前者改变大小,但不能改变像素,后者则可以,这里的大小指的是文件的存储大小,所以用resize,相对于压缩了文件,但显示的尺寸是没变的,所以在合成图片之前,先用thumbnail改变了图片像素尺寸,代码如下:

png_QR = Image.open(QR_name)  # 重新打开二维码图片
png_QR.thumbnail((80, 80), Image.ANTIALIAS)  # 改变二维码大小
png_QR.save(QR_name)  # 保存修改尺寸后的二维码

最后一步,也是os模块的作用,估计自己是有点强迫症,我将合成用的二维码图片删掉
os.remove(QR_name) # 删除二维码文件

完成后附上完整的代码:

def poster(path, str1):'''path:海报模板文件路径添加的文字'''png1 = Image.open(path) #打开文件draw = ImageDraw.Draw(png1)font = ImageFont.truetype(r"C:\Windows\Fonts\STFANGSO.ttf", 40, encoding="utf-8")  # 设置字体draw.text((190, 300), str1, font=font, fill='black')  # 添加文字img_name = str1 + '.jpg'  # 海报名称QR_name = 'code.jpg'  # 二维码名称QR_code = qrcode.make(str1)  # 生成二维码QR_code.save(QR_name)  # 保存二维码png_QR = Image.open(QR_name)  # 重新打开二维码图片png_QR.thumbnail((80, 80), Image.ANTIALIAS)  # 改变二维码大小png_QR.save(QR_name)  # 保存修改尺寸后的二维码png_QR = Image.open(QR_name)  # 重新打开二维码图片png1.paste(png_QR, (35, 595))  # 添加到海报上png1.save(img_name)  # 保存海报os.remove(QR_name)  # 删除二维码文件

定义为函数,剩下的就是批量生成了,这是最简单的一步,不赘述了

name_list = ['张三','李四']
for i in name_list:poster('model.jpg', i)

最后谈谈自己的收获吧:
第一,先写需求分析,这点最重要,捋清楚思路再下手,事半功倍!
第二,不会没关系,百度一下,CSDN、博客园、脚本之家,都能找到答案,自己比较喜欢CSDN的风格。要是找不到答案,可以直接去找相关模块的中文文档,API中会有介绍,不过都写的比较简单,看着有点费劲。
第三,多练,多练,多练!

【Python实例分析】批量生成海报--自动添加姓名和二维码相关推荐

  1. 用二维码制作软件批量生成数据不定固定尺寸的二维码

    二维码的尺寸大小跟它包含的数据多少相关,具体尺寸可以在条码打印软件里设置.但是如果需要连接数据库批量生成二维码,而且二维码的数据时长短参差不齐的时候,二维码大小也会参差不齐.如果需要将数据不同的二维码 ...

  2. Python学习之生成带logo背景图的二维码(静态和动态图)

    前言 二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明.现随着智能手机的普及,已广 ...

  3. java生成自定义标志、大小的二维码

    为什么80%的码农都做不了架构师?>>>    前段时间没事突然看到有些宣传海报上面打印了带log的二维码,于是在网上查找了生成二维码的方法,自己进行了写修改,下面直接贴出代码供参考 ...

  4. 如何用WxJump成功解决生成在微信可用的网址二维码的API接口

    现阶段,微信推广是传播信息速度最快的方法,见的最多的就是在海报上贴上微信二维码,让看到的人都能立刻了解到自己的产品,但是由于微信官方要维持一个绿色的环境, 因此对扫码推广有着非常苛刻的审查, 虽然没有 ...

  5. 小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈

    小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈 一.概述 需要用到的生成二维码组件(可自行下载添加到小程序根目录utils里):https://github.com/demi52 ...

  6. Java实现生成可跳转指定页面的二维码

    Java实现生成可跳转指定页面的二维码 package test; import java.awt.BasicStroke; import java.awt.Graphics; import java ...

  7. 【Python】使用qrcode库实现某校校门口进校二维码实时刷新

    [Python]使用qrcode库实现某校校门口进校二维码实时刷新 简介 因防疫要求,某学校校门口需要学生扫码进校,而部分学生不遵守学校制定的出入校规定,故学校要求在系统的二维码设定为实时刷新,且不允 ...

  8. PHP版单文件index.php直接生成QQ微信支付宝三合一收款二维码完整源码

    打开EditPlus 5类似的工具新建一个utf-8格式的php页面,将下面的源码复制进去,然后修改前十二行对应的信息即可,下面的两千多行代码为全自动生成内容无需修改,改好后保存名为index.php ...

  9. C#生成带背景和文字的二维码图片

    /// <summary>         /// 生成带背景和文字的二维码图片         /// </summary>         /// <param na ...

最新文章

  1. iOS 数据持久化 -- Core Data (2)
  2. 进程中的一个线程死了所引发的后果
  3. ctype函数_PHP ctype_xdigit()函数与示例
  4. JEECG 社区开源项目下载(总览)
  5. JS 设计模式 一(接口)
  6. angularjs config_AngularJS依赖注入
  7. vb ClipBoard 剪切板应用(复制剪切粘贴)
  8. python char 相等_用 Python 实现 Excel文本函数
  9. Ubuntu终端常用的快捷键,光标移动到开始位置
  10. 【WEB】HAR文件(http archive format)的介绍和查看
  11. 社会工程学攻击的三个典例
  12. php 变量加的作用是什么,php变量的定义和作用是什么 - php完全自学手册 - php中文网手册...
  13. 乞丐的一句话,感动中国13亿人。
  14. 垃圾分类小程序拍照识别垃圾分类微信小程序开发源码
  15. linux ip_conntrack_max,解?Linux NAT ip_conntrack: table full的方法
  16. 倾斜摄影超大场景的三维模型的顶层合并,提升模型在WEB三维展示效果
  17. centos7上安装rar解压软件
  18. Git push基础用法
  19. win7下maven配置+intell IDEA中多maven(导入、配置)运行综合
  20. 计算机技术在测绘专业应用,浅析计算机在现代测绘技术应用.doc

热门文章

  1. yum源替换成阿里源以及yum源替换成本地源
  2. c语言电子日历程序,c语言程序设计电子日历
  3. ICPC 6828 Help cupid(Regionals 2014 Latin America)
  4. 【匿名无人机】遥控器重新对码步骤
  5. k8s 1.14 安装 Dashboard
  6. Python爬虫scrapy
  7. Red Pitaya WiFI连接
  8. 数组名与数组名取地址的差异
  9. anchor free 目标检测_CVPR 2020 | 商汤提出 Anchor-free 目标检测新网络
  10. WIN11打开照片 浏览器 office等软件启用硬件加速后总黑屏