使用pillow生成分享图片

作者 梦想.家 日期 2017-04-01 字数 1,645
使用pillow生成分享图片

重复性的工作一定要交给计算机去做!

有时候要为公司做一张宣传用的分享图片,很简单交给设计通过ps、AI做好就行了,但是如果一个网站要为每个用户生成一张专属的分享图片,如果让设计师一张一张的去做,哪设计师估计会崩溃。下面就来演示用程序来生成一张在简书的专属分享图片吧。

程序生成分享图片分析

程序生成分享图片不是说程序从无到有生成一张图片,而是说我们把设计师设计的设计稿抽象成一块一块的,然后通过程序算法去把它们组装起来成一张新图片。我们通过下面这张图片来说明吧!

我的简书分享图片标记图

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

本次用到的素材

模板图片(设计师设计好)

template.jpg

头像图片

avatar.jpg

二维码图片

我的简书首页地址生成的二维码 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生成分享图片

原文链接:http://www.mengxiangjia.info/2017/04/01/create-image-by-pillow/

版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0