先說痛點,寫完一篇公眾號,都要為其配一個封面,而我的封面已經很簡單了,大部分情況下都是 文章題目 + 背景圖片 的形式,簡單使用 PS 也會,但是每次還要調整圖片大小,文字樣式,大小等等還是太繁瑣,最好給一張 圖片 + 文字 按照一定大小,位置直接生成就完事了
這一篇主要是確定自己的需求,和實現的這些需求需要用到一些 python 庫
操作界面這個工具在我的腦海裡可能只有幾個簡單的按鈕,所以直接選擇 python 自帶的 tkinter
tkinter 是 Python 的標準 GUI 庫,這意味著,只要安裝了 Python, 它就自帶這個庫,不用再額外下載安裝 pip install
圖片尺寸封面的圖片尺寸是有一定要求的
所以為了方便最後生成的圖片直接為 2.35:1,並將圖片、文字比較核心的內容儘量放在 1:1 區域中
因為我提供一個比較簡單的界面,其中必然會有一個類似畫布的控制項來呈現最後需要導出的圖片,剛好 tkinter 中存在 Canvas 來呈現圖片
而現在電腦的屏幕解析度最少都是 1366*768, 在 2.35:1 的前提下我們將畫布大小固定在 940:400,這樣封面大小感覺在電腦上呈現時應該還不錯
資源導入和控制我的封面僅僅只需要文字和圖片,那麼圖片和文字應該由我來輸入
圖片點擊按鍵 (使用 tkinter 中的 Button) 彈窗 (使用 tkinter 中的 filedialog) 選擇圖片圖片可以在 1:1 上也能完整展示關於圖片的放縮控制等,可以直接使用 python 下的一個第三方圖像處理庫 PIL(Python Image Library), 而它提供的 ImageTk 對象也支持在 tkinter 的 Canvas 上直接繪製
文字提供一個輸入框 (使用 tkinter 中的 Entry),讓用戶輸入,並且可以提供類似於 windows 下自帶的 畫圖 中對文本的編輯功能,文字的 字體,粗細,斜體,下劃線,大小,顏色 等等,文字也最好一直是在圖片上面顯示,避免被圖片遮蓋
tkinter 的 Canvas 提供了 create_text 來直接繪製文字,並且可以設置字體的樣式等功能顏色選擇器 可以直接使用 tkinter 中的 colorchooser 對象文字的字體的選擇和大小可以使用 tkinter 中 Combobox(下拉菜單) 控制項控制可以提供這2個對象移動的功能,上下左右移動,指定其中一個移動或者兩個一起移動,以及每次移動的單位控制標尺用標尺在畫布上標記出中央 1:1 的兩條線,以及橫著的一條中軸線,這樣可以避免在移動過程中圖片或者文字出現較大位置偏差。成品初版工程地址: https://github.com/catcheroftime/CreateWxCover
詳細的代碼分析會放在之後一篇文章中展開
結果展示最後保存的圖片將標尺去掉,圖片大小是預料中的 940:400 (2.35:1), 並且測試的移動等功能也和預期效果差不多
進一步為了更方便,在打包成 windows 下的可執行程序,一般情況下會使用2個工具, pipenv 以及 pyinstaller
pipenv 的目的主要是為這個項目隔離出一個乾淨的 python 環境, 防止打包一些不必要的第三方庫pyinstaller 就是我們打包時需要用到的庫# 項目路徑下命令行
# 創建虛擬環境
pipenv install
# 打開虛擬環境
pipenv shell
# 安裝我們唯一使用到的一個第三方庫 Pillow (PIL)
pip install Pillow
# 安裝打包工具
pip install pyinstaller
# 打包
pyinstaller -F -w -i icon.ico cover.py
總結以為寫起來挺簡單的,結果在 tkinter 上折騰了太多時間,和 Qt 的控制項在上手難度方面的差距還是能感受到的
回味一下,這個工具好像就是幫我一鍵創建好指定大小的圖層,然後一鍵將我的文字和圖片居中,然後就沒有然後了,也算是方便了很多了~