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

有时候要为公司做一张宣传用的分享图片,很简单交给设计通过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生成分享图片的更多相关文章

  1. 使用PHP生成分享图片

    小程序导航 wq.xmaht.top 假设代码中用到的资源文件夹在当前code_png目录下: /** * 分享图片生成 * @param $gData 商品数据,array * @param $co ...

  2. 微信小程序利用canvas生成海报分享图片

    一 . 效果 这是借用女神照生成的分享的海报,图片来自网络. 新增了poster组件和更新图片自适应 二 . 准备 准备两张图片连接,最好是自己开发账号验证的https图片链接. 三 . 实现思路 其 ...

  3. [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件

    7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...

  4. 【转】DelphiXE10.2.3——跨平台生成验证码图片

    原文地址 Java.PHP.C#等很容易在网上找到生成验证码图片的代码,Delphi却寥寥无几,昨天花了一整天时间,做了个跨平台的验证码,可以用在C/S和B/S端,支持Windows.Linux.An ...

  5. python中用Pillow库进行图片处理

    一.Python中 PIL 图像处理库简介 PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives).PIL非常适合于图像归档以及图像的批处理任务.你可以使用PIL创建缩略图, ...

  6. 第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证

    Tornado框架-生成验证码图片,以及验证码结合Session验证 第一.生成验证码图片  生成验证码图片需要两个必须模块 1.python自带的random(随机模块) 2.Pillow()图像处 ...

  7. python 生成随机图片验证码

    1.安装pillow模块 pip install pillow (1)创建图片 from PIL import Image #定义使用Image类实例化一个长为400px,宽为400px,基于RGB的 ...

  8. Android分享图片失败解决方案

    前言:在做图片分享到微博或是用彩信分享的时候,会遇到“无法将图片添加到信息中”,其实这个问题的原因是创建的那个图片默认是,只能被当前应用调用,无法被其他应用调用,即分享的时候,无法读取到图片,并提示I ...

  9. 小程序(Wepy)--生成海报图片

    对于小程序的分享, 除了分享给朋友, 好友群,是可以直接做到的, 但是要想扩大推广范围, 通过生成海报图片, 将自己小程序码带进去,应该是目前我所知的好办法了. 但是海报也不是那么好搞.之前自己手写出 ...

随机推荐

  1. nfs+rsync+inotify实现文件的实时同步

    准备三台服务器进行测试: nfs_server:192.168.12.110 web_server:192.168.12.111 rsync_server:192.168.12.112 网络规划图: ...

  2. Linux OS共享文件

    背景: 相较于windows.unix等OS,Linux因为其开源.安全.稳定.性能优越等优点,已越来越受到互联网的青睐.而我们在学习和使用Linux也就会考虑到Linux机器和我们日常用的windo ...

  3. WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理--02

    兼容问题目录 8.IE6不支持固定定位 9.IE6下前面元素浮动,后面元素不浮动后他们之间会有间隙 10.IE6下双边距问题 11.IE67下父级有边框,子级有margin的话会不起作用 12.IE6 ...

  4. 一天搞定CSS:支持IE的Layout布局--16

    1.BFC和Layout区别: BFC和Layout的作用是一样的,只是对浏览器的支持不同而已. BFC- -标准浏览器所具有的 Layout- -IE浏览器所具有的 BFC详解地址:http://b ...

  5. 生成JSON数据--官方方法

    官方生成方法: 1)需要什么就给什么,要属性就给属性,要对象就给对象,要集合就给集合 2)添加都是使用put()方法 要求: 1.生成如下JSON数据: {"age":4,&quo ...

  6. 踩一踩微信小程序开发的坑---tabBar

    最近忙于开发视频直播的项目,小程序学习也放置了两三个星期了,web开发者工具更新到新版,发现上个版本做的demo不显示了

  7. 并行模式库PPL应用实战(一):使用task类创建并行任务

    自 VS2010 起,微软就在 CRT 中集成了并发运行时(Concurrency Runtime),并行模式库(PPL,Parallel Patterns Library)是其中的一个重要组成部分. ...

  8. forfiles命令批处理删除过期文件

    命令格式: forfiles.exe /p "D:\备份" /s /m *.zip /d -7 /c "cmd /c del @path" /p:指定目录 /s ...

  9. webpack3新特性介绍

    6月20号webpack推出了3.0版本,官方也发布了公告.根据公告介绍,webpack团队将未来版本的改动聚焦在社区提出的功能需求,同时将保持一个快速.稳定的发布节奏.本文主要依据公告内容,简单介绍 ...

  10. ecshop循环计数

    循环依次递增+1 <!-- {foreach from=$comments item=comment name=comment} --> {$smarty.foreach.comment. ...