ISE頭條號海報生成器

完整源碼可在公衆號:「01二進制」後臺回覆:「海報生成器」獲取html

最近自閉了一段時間,仔細思考一番後仍是決定要把本身心中所想堅持下去。今天來分享一個平常生活中常常見到,可是製做起來又可能會一時沒有思路的東西,主要功能就是生成帶二維碼的卡片或者海報。python

以前莫名其妙的被導師安排負責管理實驗室的頭條號,任務不難,就是接收實驗室學長學姐翻譯轉述的論文,而後再發布到今日頭條的頭條號上,最後再生成以下所示的宣傳圖便可:markdown

當時以爲,不就是發發文章,而後再用ps作個圖這麼簡單嗎。可接手以後才發現我畢竟圖樣圖森破啊,從去年11月我開始發文章到今天,期間從未有一天斷過,可是這頭條號的編輯器也從未更新過,一個這麼大的自媒體企業,文章的編輯器居然爛的跟坨💩同樣,不支持外部圖片,不支持markdown,不支持數學公式,不支持多級標題。(別跟我說什麼能夠把markdown轉成html而後再複製進頭條號的編輯器裏面,樣式都變成鬼了)編輯器

扯遠了扯遠了,回到正題。以前這麼多天實現上述須要的主要流程以下:工具

  1. (採起各類方式優化排版)把文章發佈到(不支持各類經常使用功能的)頭條號上
  2. 文章發佈後,獲取其文章連接,併到草料二維碼生成器網站,上傳實驗室logo後生成二維碼下載至本地
  3. 利用PhotoShop將封面圖、文章標題和文章二維碼合成在一塊兒後發給老師。

在經歷了100天上述這樣重複的操做以後,我厭煩了。難道就沒有一個工具可讓我只輸入文章連接和標題就自動生成海報的嗎?post

苦苦尋覓半天無果,也罷,有條件要上,沒條件創造條件也要上。沒有現成的輪子,那就只能本身打造一個了,Python無疑是開發這個小工具的首選。字體

通常用於推廣的海報或卡片樣式都差很少,須要改變的主要就是二維碼,因此只須要準備好海報的背景圖,而後根據用戶提供的二維碼,將其貼在海報指定的位置上便可。優化

這次實驗的項目結構以下:網站

assets文件夾中包含一些資源文件,例如msyhl.ttc(字體文件)template.jpg(背景模版圖片)。output是生成的海報存放的路徑url

生成帶logo的二維碼

本次生成二維碼依賴於 PIL 模塊qrcode 庫,官方地址爲:https://pypi.org/project/qrcode/5.1/,這裏不解釋用法,感興趣的本身去官方文檔下了解。這裏就直接上代碼了,具體代碼的用意詳見註釋:

# 生成一個帶logo的二維碼
def generateQRCode(url):
    # 初始化
    qr = qrcode.QRCode(
        version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8)
    # 添加內容
    qr.add_data(url)
    qr.make(fit=True)

    img = qr.make_image()
    img = img.convert("RGBA")

    # 讀取logo
    icon = Image.open("assets/logo.jpg")
    # 設置logo
    img_w, img_h = img.size
    factor = 4
    size_w = int(img_w / factor)
    size_h = int(img_h / factor)

    icon_w, icon_h = icon.size
    if icon_w > size_w:
        icon_w = size_w
    if icon_h > size_h:
        icon_h = size_h
    icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)

    # 將logo併入原二維碼中
    w = int((img_w - icon_w)/2)
    h = int((img_h - icon_h)/2)
    icon = icon.convert("RGBA")
    img.paste(icon, (w, h), icon)
    rgb_im = img.convert('RGB')

    # 保存到指定路徑下
    today = datetime.date.today()
    folder_path = 'output/'+str(today)
    mkdir(folder_path)
    rgb_im.save(folder_path+'/qr.jpg')
複製代碼

生成海報

咱們先來梳理下,想要生成一張知足咱們需求的海報須要哪些元素:

  • 二維碼(qrImg)
  • 背景模版圖片(template.jpg)
  • 文章標題(postTitle)
  • 和文章有關的封面圖(postPic)

換一種方式呈現代碼,推薦一個將代碼轉換成圖片的美化工具Carbonize

其實仔細閱讀過這段代碼以後才以爲總體的思路一目瞭然:先讀取須要的素材文件(二維碼、標題),而後將素材粘貼到背景圖片的指定位置。惟一複雜點的就是要找到一個合適的粘貼點,這個沒辦法,只能本身去試。

完整源碼可在公衆號:「01二進制」後臺回覆:「海報生成器」獲取

Tips

這裏有點我要提下,就是利用PIL更改圖片大小那塊,也就是postPic.thumbnail((width/1.5, height/1.5))這個地方,其實PIL中還有一個方法叫作resize也是用來更改圖片的大小的,那二者有何區別呢?

使用PIL生成縮略圖用兩種方式,resizethumbnail,區別在於使用reszie會返回一個新對象, 而使用thumbnail則會在原對象上進行修改,即thumbnail會覆蓋原圖。

>>> from PIL import Image
>>> im = Image.open('a.jpg')
>>> im.size   # 原圖尺寸
(3264, 2448)
>>> id(im)
140253860921640
>>> resize_im = im.resize((100,100))
>>> resize_im
<PIL.Image.Image image mode=RGB size=100x100 at 0x7F8F65A0A518>
>>> id(resize_im)
140253862077720
>>> thumb_im = im.thumbnail((100, 100))
>>> thumb_im
>>> im.size   # 使用thumbnail後的原圖尺寸改變,resize後的結果不必定等於指定的尺寸,由於是按比例縮放的
(100, 75)
複製代碼
相關文章
相關標籤/搜索