重復性的工作一定要交給計算機去做拼苍!
有時候要為公司做一張宣傳用的分享圖片独令,很簡單交給設計通過ps、AI做好就行了液肌,但是如果一個網(wǎng)站要為每個用戶生成一張專屬的分享圖片,如果讓設計師一張一張的去做鸥滨,哪設計師估計會崩潰嗦哆。下面就來演示用程序來生成一張在簡書的專屬分享圖片吧谤祖。
程序生成分享圖片分析
程序生成分享圖片不是說程序從無到有生成一張圖片,而是說我們把設計師設計的設計稿抽象成一塊一塊的老速,然后通過程序算法去把它們組裝起來成一張新圖片泊脐。我們通過下面這張圖片來說明吧!
圖中的綠色框內(nèi)的內(nèi)容是固定不變的烁峭,藍色圓圈內(nèi)的內(nèi)容是變化的(尤其是點贊數(shù)和文章總字數(shù)會隨時變化的)**容客,我們可以這樣做把背景和固定不變的內(nèi)容讓設計師做成一張背景圖片,剩下的隨時會變化的東西就通過程序繪制上去约郁。
本次用到的素材如下
模板圖片(設計師設計好)
頭像圖片
二維碼圖片
生成圖片所需的工具說明
我們使用python這門通用編程語言來處理圖片缩挑,所以首先要在電腦上安裝python,還用到了一個python圖片處理的庫Pillow等python安裝好之后通過pip install Pillow
安裝即可。[注意:Pillow的首字母P是大寫的]
生成步驟
我們可以把模板圖片理解成一張黑板鬓梅,然后把頭像圖片供置,二維碼圖片,文字等貼在黑板正確的位置就完成了绽快,這個過程就相當于我們向黑板貼東西的過程芥丧!
step1:先把頭像貼上去,貼頭像的時候這里會有一個問題坊罢,頭像圖片是正方形的续担,而我們要的效果是一個圓形的頭像,這里需要寫個函數(shù)專門處理圓形頭像的問題活孩。代碼如下:
"""
將頭像變成圓形繪制在背景圖片上物遇,然后將合成的圖片對象返回
"""
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)
#繪制獲取的點贊數(shù)
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)
#繪制獲取的點贊數(shù)
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然后把模板圖片询兴、你的頭像圖片、你的簡書主頁的二維碼圖片放在同一目錄下起趾,修改腳本中的參數(shù)诗舰,在當前目錄打開命令行執(zhí)行下面的命令:
python xxx.py
就會在當前目錄生成一張屬于你自己的簡書分享圖片了。
我的簡書分享圖片
分享圖片的二維碼鏈接為我的簡書首頁地址训裆。
模板圖片只用ps簡單的做了一下眶根,不好看請輕噴,如果你有好的模板請在評論處分享~
使用Pillow生成圖片的效率還是比較高的windows系統(tǒng)下在1s以內(nèi)缭保,linux系統(tǒng)下0.1s以內(nèi)汛闸,系統(tǒng)配置不同可能時間也有一些差別。
這里提供一個pillow官方文檔地址方便查看艺骂。
本文源碼地址
文章如有誤诸老,請不吝賜教,謝謝!