使用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)--生成海报图片
对于小程序的分享, 除了分享给朋友, 好友群,是可以直接做到的, 但是要想扩大推广范围, 通过生成海报图片, 将自己小程序码带进去,应该是目前我所知的好办法了. 但是海报也不是那么好搞.之前自己手写出 ...
随机推荐
- CSS小技巧-两个盒子之间的间距问题
1.水平排放的盒子,水平间距是两个margin的累加 2.垂直排放的盒子,垂直间距是合并的取最大值
- JDBC连接数据库程序
废话少说,看了尚学堂的视频以及某大神的博客,总结出以下.(本文以oracle数据库为例) 创建一个JDBC连接数据库的程序,需要着手做以下几件事情: 注意,这里边使用了java.sql.Stateme ...
- linux下mysql重置密码
如果忘记mysql的root密码可以采取下面的步骤重新设置 1.kill掉所有mysql的进程 2.使用--skip-grant-tables的参数启动mysql shell> mysqld_s ...
- html加javascript和canvas类似超级玛丽游戏
html加javascript和canvas制作 代码来源于网上 复制可用 <!doctype html><html lang="en"> <head ...
- 影响国内WinCE7发展的最大障碍是没有D版下载
WinCE红火的时代已经过去,做嵌入式系统时考虑WinCE的越来越少,网络上相关文章也是越来越少. 但真正用过WinCE的应该有体会,它集成了文件系统,tcp/ip,GUI系统,usb驱动,就这些,你 ...
- canvas 画钟表
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- HTML 简单了解
HTML 特别的通俗易懂!想学自己制作网页的,就来我这看看吧! 首先 我先介绍一下什么是HTML! HTML是用来描述网页的一种语言!他结合CSS样式之后会有非常炫酷的样式! 1.HTML是指一种超文 ...
- 从OneNote走出,技术博客养成记
2010年9月北上求学,在一所普通本科院校学习计算机专业,年少轻狂未能领悟计算机技术的本质渐生弃学之意. 2013年9月南下参军,在一个电抗部队从事通信指控专业,填补了扛枪演练的男儿情怀却又无法抵制对 ...
- Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息
详情请看:Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息 在项目中需要获取到当前设备,例如手机的ID,联网状态,等,然后这个Cordova里有这个插件可以用, ...
- 手把手教你从基础学习JQuery
JQuery JQuery 语法 1.jQuery("选择器").action();通过选择器调用事件函数 但jQuery中,jQuery可以用$代替,即$("选择器&q ...