ISE頭條號海報生成器
完整原始碼可在公眾號:「01二進位制」後臺回覆:「海報生成器」獲取
最近自閉了一段時間,仔細思考一番後還是決定要把自己心中所想堅持下去。今天來分享一個日常生活中經常見到,但是製作起來又可能會一時沒有思路的東西,主要功能就是生成帶二維碼的卡片或者海報。
之前莫名其妙的被導師安排負責管理實驗室的頭條號,任務不難,就是接收實驗室學長學姐翻譯轉述的論文,然後再發布到今日頭條的頭條號上,最後再生成如下所示的宣傳圖即可:

當時覺得,不就是發發文章,然後再用 ps 做個圖這麼簡單嗎。可接手之後才發現我畢竟圖樣圖森破啊,從去年11月我開始發文章到今天,期間從未有一天斷過,但是這頭條號的編輯器也從未更新過,一個這麼大的自媒體企業,文章的編輯器竟然爛的跟坨:hankey:一樣,不支援外部圖片,不支援markdown,不支援數學公式,不支援多級標題。(別跟我說什麼可以把markdown轉成html然後再複製進頭條號的編輯器裡面,樣式都變成鬼了)
扯遠了扯遠了,回到正題。之前這麼多天實現上述需要的主要流程如下:
- (採取各種方式優化排版)把文章釋出到(不支援各種常用功能的)頭條號上
- 文章釋出後,獲取其文章連結,併到草料二維碼生成器網站,上傳實驗室logo後生成二維碼下載至本地
- 利用PhotoShop將封面圖、文章標題和文章二維碼合成在一起後發給老師。
在經歷了100天上述這樣重複的操作之後,我厭煩了。難道就沒有一個工具可以讓我只輸入文章連結和標題就自動生成海報的嗎?
苦苦尋覓半天無果,也罷,有條件要上,沒條件創造條件也要上。沒有現成的輪子,那就只能自己打造一個了,Python無疑是開發這個小工具的首選。
一般用於推廣的海報或卡片樣式都差不多,需要改變的主要就是二維碼,所以只需要準備好海報的背景圖,然後根據使用者提供的二維碼,將其貼在海報指定的位置上即可。
此次實驗的專案結構如下:

assets資料夾中包含一些資原始檔,例如 msyhl.ttc(字型檔案)
、 template.jpg(背景模版圖片)
。output是生成的海報存放的路徑
生成帶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生成縮圖用兩種方式, resize
和 thumbnail
,區別在於使用 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) 複製程式碼