用程序生成一張在簡書的專屬分享圖片

重復性的工作一定要交給計算機去做!

有時候要為公司做一張宣傳用的分享圖片,很簡單交給設計通過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然后把模板圖片、你的頭像圖片、你的簡書主頁的二維碼圖片放在同一目錄下,修改腳本中的參數,在當前目錄打開命令行執(zhí)行下面的命令:

python xxx.py

就會在當前目錄生成一張屬于你自己的簡書分享圖片了。

我的簡書分享圖片

最終分享效果圖

分享圖片的二維碼鏈接為我的簡書首頁地址。

模板圖片只用ps簡單的做了一下,不好看請輕噴,如果你有好的模板請在評論處分享~

使用Pillow生成圖片的效率還是比較高的windows系統(tǒng)下在1s以內,linux系統(tǒng)下0.1s以內,系統(tǒng)配置不同可能時間也有一些差別。

這里提供一個pillow官方文檔地址方便查看。

本文源碼地址
文章如有誤,請不吝賜教,謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,048評論 25 709
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,835評論 6 427
  • GitHub 上有一個 Awesome - XXX 系列的資源整理,資源非常豐富,涉及面非常廣。awesome-p...
    若與閱讀 19,322評論 4 417
  • 夏夜,穿過路邊的草叢聽蟲鳴聲在耳邊輕輕環(huán)繞,這是一種靜;散步在荷塘邊聽蛙聲一片喧囂,這是一種靜;路過某個公園時,聽...
    大鵬寫故事閱讀 848評論 0 0
  • 焦點講師一期班洛陽劉琳堅持分享第六十九天 人家都說笑一笑,十年少,可是今天我在講師班的課堂上,一天幾乎都在...
    小溪與大海閱讀 532評論 0 0

友情鏈接更多精彩內容