最近参加了老男孩的一个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. stella forum v1.2 用例分析
  2. c语言学习笔记-if语句块一定要加分号
  3. 【剑指offer-Java版】28字符串的排列
  4. python扫雷代码_室友扫雷通关来炫耀!我用Python做出自动扫雷十秒通关!
  5. Linux Daemon Writing HOWTO
  6. PC-lint使用说明
  7. python编码程序_python 编码
  8. 【计算机网络】传输媒体与物理层概念辨析
  9. 【推荐实践】深度学习在阿里B2B电商推荐系统中的实践
  10. 【Absible学习】Ansible普通用户sudo执行指令
  11. SSL证书相关技巧 -- 为什么有时候访问某些加密网站是不需要证书的?
  12. sxssfworkbook 设置单元格大小_Offset属性和Resize属性相结合,完美实现选择区域大小的改变...
  13. 世界顶级图表-华尔街日报配色方案详解
  14. 如何理解二元函数的可导与可微?
  15. mysql商品库存字段_mysql商品库存扣减问题总结
  16. Word2016安装MathType流程及“53”.wll文件未找到错误解决办法
  17. 给你看个宝贝:GitHub 最野的开源库,把你拿捏的死死的。。。
  18. igraph与netwrokx的转换
  19. 数字图像处理基础(3)--图像合成
  20. sql 添加注释的方法

热门文章

  1. 数据库 试述关系模型的完整性规则。在参照完整性中,什么情况下外码属性的值可以为空值?(精简答案)
  2. emeditor pro注册秘钥
  3. maven 打包zip,jsw相关
  4. @After与@Afterruning的区别
  5. 前端学习从入门到高级全程记录之11 (云道页面例子后续)
  6. 判断ImageView的图片是否为默认
  7. BetaFlight深入传感设计之十:传感器物理特性方向对齐
  8. 最新版MinimogWP– 高转换电子商务 WordPress 主题免费下载
  9. 啥是云主机,云主机是啥样的?
  10. 基于参考模型的主动悬架滑模控制(详细滑模控制推导)