使用pillow生成分享图片
重复性的工作一定要交给计算机去做!
有时候要为公司做一张宣传用的分享图片,很简单交给设计通过ps、AI做好就行了,但是如果一个网站要为每个用户生成一张专属的分享图片,如果让设计师一张一张的去做,哪设计师估计会崩溃。下面就来演示用程序来生成一张在简书的专属分享图片吧。
程序生成分享图片分析
程序生成分享图片不是说程序从无到有生成一张图片,而是说我们把设计师设计的设计稿抽象成一块一块的,然后通过程序算法去把它们组装起来成一张新图片。我们通过下面这张图片来说明吧!

我的简书分享图片标记图
图中的绿色框内的内容是固定不变的,蓝色圆圈内的内容是变化的(尤其是点赞数和文章总字数会随时变化的),我们可以这样做把背景和固定不变的内容让设计师做成一张背景图片,剩下的随时会变化的东西就通过程序绘制上去。
本次用到的素材
模板图片(设计师设计好)

头像图片
![]()
二维码图片

我的简书首页地址生成的二维码 qrcode.jpg
生成图片所需的工具说明
我们使用python这门通用编程语言来处理图片,所以首先要在电脑上安装python,还用到了一个python图片处理的库Pillow等python安装好之后通过pip install Pillow安装即可。[注意:Pillow的首字母P是大写的]
生成步骤
我们可以把模板图片理解成一张黑板,然后把头像图片,二维码图片,文字等贴在黑板正确的位置就完成了,这个过程就相当于我们向黑板贴东西的过程!
step1:先把头像贴上去,贴头像的时候这里会有一个问题,头像图片是正方形的,而我们要的效果是一个圆形的头像,这里需要写个函数专门处理圆形头像的问题。代码如下:
"""
将头像变成圆形绘制在背景图片上,然后将合成的图片对象返回
"""
def drawCircleAvatar(im,background):
im = im.resize((170, 170));
bigsize = (im.size[0] * 3, im.size[1] * 3)
#遮罩对象
mask = Image.new('L', bigsize, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0) + bigsize, fill=255)
mask = mask.resize(im.size, Image.ANTIALIAS)
im.putalpha(mask)
background.paste(im, (235, 155), im)
return background
step2:绘制用户的昵称和写了多少字和收获多少个赞
#绘制用户昵称
font1 = ImageFont.truetype("simhei.ttf",32)
drawImage=ImageDraw.Draw(back_img)
drawImage.text((272, 366), unicode('梦想家','utf-8'), font=font1) #绘制用户写了多少字
font2 = ImageFont.truetype("simhei.ttf",30)
drawImage=ImageDraw.Draw(back_img)
drawImage.text((110, 436), unicode('写了2388个字','utf-8'), font=font2) #绘制获取的点赞数
font3 = ImageFont.truetype("simhei.ttf",30)
drawImage=ImageDraw.Draw(back_img)
drawImage.text((356, 436), unicode('收获10个赞','utf-8'), font=font3)
step3:绘制二维码图片
#将二维码图片粘贴在背景图片上
region = qrcode_img
region = region.resize((180, 180))
back_img.paste(region,(230,860))
完整代码
# -*- coding: utf-8 -*-
from PIL import Image,ImageFont,ImageDraw
import time,sys
reload(sys)
sys.setdefaultencoding('utf-8') """
生成分享图片的方法
"""
def createShareImg(avatarUrl,qrcodeUrl,nickname,countWord,countLiked):
startTime=time.time()
#加载背景图片
background=Image.open(ur'template.jpg')
#加载头像图片
avatar = Image.open(avatarUrl,"r")
qrcode_img = Image.open(qrcodeUrl,"r") # 将背景图片和圆形头像合成之后当成新的背景图片
back_img=drawCircleAvatar(avatar,background) #将二维码图片粘贴在背景图片上
region = qrcode_img
region = region.resize((180, 180))
back_img.paste(region,(230,860)) #绘制用户昵称
font1 = ImageFont.truetype("simhei.ttf",32)
drawImage=ImageDraw.Draw(back_img)
drawImage.text((272, 366), unicode(nickname,'utf-8'), font=font1) #绘制用户写了多少字
font2 = ImageFont.truetype("simhei.ttf",30)
drawImage=ImageDraw.Draw(back_img)
drawImage.text((110, 436), unicode(countWord,'utf-8'), font=font2) #绘制获取的点赞数
font3 = ImageFont.truetype("simhei.ttf",30)
drawImage=ImageDraw.Draw(back_img)
drawImage.text((356, 436), unicode(countLiked,'utf-8'), font=font3) #保存图片到文件
back_img.save('out.jpg') #保存图片
endTime=time.time() print "本次生成图片一共用时:".decode("utf-8").encode("gbk")
print str(endTime-startTime)+"秒".decode("utf-8").encode("gbk") """
将头像变成圆形绘制在背景图片上,然后将合成的图片对象返回
"""
def drawCircleAvatar(im,background):
im = im.resize((170, 170));
bigsize = (im.size[0] * 3, im.size[1] * 3)
#遮罩对象
mask = Image.new('L', bigsize, 0)
draw = ImageDraw.Draw(mask)
#画椭圆的方法
draw.ellipse((0, 0) + bigsize, fill=255)
mask = mask.resize(im.size, Image.ANTIALIAS)
im.putalpha(mask)
background.paste(im, (235, 155), im)
return background if __name__=='__main__':
avatarUrl="avatar.jpg"
qrcodeUrl="qrcode.jpg"
nickname="梦想家"
countWord="写了2388个字"
countLiked="收获10个赞"
createShareImg(avatarUrl,qrcodeUrl,nickname,countWord,countLiked)
如果你要在本地运行此脚本命令,将此脚本复制保存成本地文件xxx.py然后把模板图片、你的头像图片、你的简书主页的二维码图片放在同一目录下,修改脚本中的参数,在当前目录打开命令行执行下面的命令:
python xxx.py
就会在当前目录生成一张属于你自己的简书分享图片了。
我的简书分享图片

最终分享效果图
分享图片的二维码链接为我的简书首页地址。
模板图片只用ps简单的做了一下,不好看请轻喷,如果你有好的模板请在评论处分享~
使用Pillow生成图片的效率还是比较高的windows系统下在1s以内,linux系统下0.1s以内,系统配置不同可能时间也有一些差别。
pillow官方文档地址方便查看。
使用pillow生成分享图片的更多相关文章
- 使用PHP生成分享图片
小程序导航 wq.xmaht.top 假设代码中用到的资源文件夹在当前code_png目录下: /** * 分享图片生成 * @param $gData 商品数据,array * @param $co ...
- 微信小程序利用canvas生成海报分享图片
一 . 效果 这是借用女神照生成的分享的海报,图片来自网络. 新增了poster组件和更新图片自适应 二 . 准备 准备两张图片连接,最好是自己开发账号验证的https图片链接. 三 . 实现思路 其 ...
- [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件
7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...
- 【转】DelphiXE10.2.3——跨平台生成验证码图片
原文地址 Java.PHP.C#等很容易在网上找到生成验证码图片的代码,Delphi却寥寥无几,昨天花了一整天时间,做了个跨平台的验证码,可以用在C/S和B/S端,支持Windows.Linux.An ...
- python中用Pillow库进行图片处理
一.Python中 PIL 图像处理库简介 PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives).PIL非常适合于图像归档以及图像的批处理任务.你可以使用PIL创建缩略图, ...
- 第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证
Tornado框架-生成验证码图片,以及验证码结合Session验证 第一.生成验证码图片 生成验证码图片需要两个必须模块 1.python自带的random(随机模块) 2.Pillow()图像处 ...
- python 生成随机图片验证码
1.安装pillow模块 pip install pillow (1)创建图片 from PIL import Image #定义使用Image类实例化一个长为400px,宽为400px,基于RGB的 ...
- Android分享图片失败解决方案
前言:在做图片分享到微博或是用彩信分享的时候,会遇到“无法将图片添加到信息中”,其实这个问题的原因是创建的那个图片默认是,只能被当前应用调用,无法被其他应用调用,即分享的时候,无法读取到图片,并提示I ...
- 小程序(Wepy)--生成海报图片
对于小程序的分享, 除了分享给朋友, 好友群,是可以直接做到的, 但是要想扩大推广范围, 通过生成海报图片, 将自己小程序码带进去,应该是目前我所知的好办法了. 但是海报也不是那么好搞.之前自己手写出 ...
随机推荐
- 点评阿里JAVA手册之编程规约(OOP 规约 、集合处理 、并发处理 、其他)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文难度系数为三星(★★★) 本文为第二篇 第一篇 点评阿里JAVA手 ...
- Floyd判圈算法
Floyd判圈算法 leetcode 上 编号为202 的happy number 问题,有点意思.happy number 的定义为: A happy number is a number defi ...
- 使用DBeaver连接hive
介绍 在hive命令行beeline中写一些很长的查询语句不是很方便,查询结果也不是很友好,于是找了一个hive的客户端界面工具DBeaver,它也支持很多符合JDBC连接的数据库,例如MySQL.O ...
- Java基础——多态
多态性是指允许不同类型的对象对同一消息做出相应.具有灵活性.抽象.行为共享.代码共享的优势,共享就意味着最大化利用和简洁,还有就是加载速度. 一.多态的作用 消除类型之间的耦合关系.即同一事件发生在不 ...
- iframe 父页面与子页面之间的方法的相互调用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JAVAEE——spring01:介绍、搭建、概念、配置详解、属性注入和应用到项目
一.spring介绍 1.三层架构中spring位置 2.spring一站式框架 正是因为spring框架性质是属于容器性质的. 容器中装什么对象就有什么功能.所以可以一站式. 不仅不排斥其他框架,还 ...
- 通过 itms:services://? 在线安装ipa ,跨过app-store
1.需要一个html文件,引导下载用户在线安装ipa <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&quo ...
- Redis的安装与使用(单节点)
IP:192.168.4.111 环境:CentOS 6.6 Redis版本:redis-3.0 (考虑到Redis3.0在集群和性能提升方面的特性,rc版为正式版的候选版,而且很快就出正式版) 安装 ...
- PHP加密解密数字
<?php /** * 加密解密类,PHP加密解密数字,适用于URL加密 * 该算法仅支持加密数字.比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密. * @version a ...
- url地址栏拼接参数写法
<script> function jiedan_do(elm){ var id=$(elm).attr("a"); window.location="__U ...