一個毫無用處的公眾號封面生成器
- 2020 年 3 月 15 日
- 筆記
一個毫無用處的公眾號封面生成器
對於一個沒有任何藝術細胞的人,寫公眾號最頭疼的無異於文章封面了. 要麼選不好圖,選好圖了呢,公眾號這個2.35:1的詭異比例還會涉及到裁剪的問題…
所以或許你已經發現了,我的文章封面很簡單. 純色圖片避免了裁剪的問題,成為那些飈設計感和美感的妖艷貨色中的一股清流
但是只是純色的圖片,貌似沒有靈魂.
今天要做的事情就是給我的清流般的封面注入靈魂.
一個極其不規範的類圖
下面是一個不規範的類圖示例,請大家不要學習.


思路總結
其實思路很簡單
-
獲取一段文字,解碼為UTF-8的二進制串 -
將解碼後的二進制串進行md5摘要,獲得一個128位的digest -
通過random.randomint()方法在這個128位的二進制串上 隨機選取3個位元組做RGB顏色. -
生成一個253*100的圖片保存到本地.同時將相關信息存入mongoDB數據庫.
所謂的解碼就更簡單了,眾所周知MD5算法是不可逆的…再加上當初我是隨機取的三個位元組,所以想通過顏色來解碼是不可能的.
但是!!! 我有一個絕妙的辦法…因為之前相關信息已經存到了數據庫里,所以我們直接在數據庫里檢索顏色的RGB值就可以了.(我簡直不要太機智)
知識點總結
注意,乾貨來了!!!
輸入內容的處理
輸入內容處理想對比較簡單
def encode(self):
return hashlib.md5(self.raw_input_str.encode('utf-8')).hexdigest()
def color_generator(self, raw_digest):
r_index = random.randint(0, 30)
g_index = random.randint(0, 30)
b_index = random.randint(0, 30)
r_color = int(raw_digest[r_index:r_index + 2], base=16)
g_color = int(raw_digest[g_index:g_index + 2], base=16)
b_color = int(raw_digest[b_index:b_index + 2], base=16)
return r_color, g_color, b_color
先使用hashlib下的方法m5()方法和hexdigest()方法獲取哈希值.
然後隨機一下取出3個位元組,分別做R G B顏色就可以了.
圖像處理
之前約等於沒有接觸過圖像處理這一塊,所以特地去查了一下python下常用的圖像處理模塊:
-
NumPy : 這個庫是科學計算的一個基礎庫,主要用來處理N維數組對象以及一些基礎數學計算,比如傅里葉變換,線性代數等. 算是一個圖片處理的中間庫 -
OpenCV : 一個專業的計算機視覺庫. 可以用於圖像視頻等的處理,比如人臉識別之類… -
PIL: Python自帶的圖像處理庫,由於年久失修,目前處於門可羅雀的狀態 -
Pillow: PIL的志願者版本,由於PIL已經很久沒有維護,功能簡單而且只支持到python2.x. 所以志願者們在PIL的基礎上開發出了pillow,支持更多的功能且支持python3 -
Pillow-SIMD: PIL究極進化版,速度更快,功能更強. SIMD指的是single instruction multiple data(單指令,多數據),是一種對海量數據進行相同操作的算法. 據說速度可以媲美OpenCV
❝
pillow是PIL的一個分支,而pillow-simd是pillow的一個分支.因為我也是第一次接觸圖像處理. 我發現很神奇的是 pillow的文檔和pillow-simd的文檔竟然是一個. 但是在安裝的時候 又是兩個包…沒有搞明白怎麼回事. 如果有大神知道的話,麻煩留言解惑.
❞
pillow模塊的基本使用
這次我採用的是Pillow,原因很簡單,殺雞焉用牛刀. 只是需要生成一個純色的小圖片而已. 安裝很簡單,如果使用Anaconda的話,它已經集成了pillow包. 如果使用的是純python3的環境,pip install pillow
就可以了.
在引入包的時候需要注意. 雖然我們用的是pillow,但是它的包名依舊是PIL. 所以在引入包的時候需要注意.
from PIL import Image
這次使用的是最基礎的方法. 主要就是創建圖像. 相關方法的具體文檔,請查閱這裡
-
PIL.Image.open(fp, mode='r')
-
「作用:」 打開一個圖像文件. -
「參數:」 -
fp:文件句柄或者文件路徑 -
mode: 和文件操作時候的mode一樣,r表示只讀,w表示只寫. w+表示讀寫
-
-
「返回值:」 Image對象
-
-
PIL.Image.new(mode, size, color=0)
-
「作用:」 創建一個Image對象. -
「參數:」 -
mode:圖像模式,具體參考文檔. -
size:圖像大小 -
color:顏色
-
-
「返回值:」 Image對象
-
-
Image.save(fp, format=None, **params)
-
「作用:」 保存圖像到文件
-
-
Image.show(title=None, command=None)
-
「作用:」 調用本地看圖軟件打開圖像
-
-
Image.close()
這裡要說的是,既然有open方法也有close方法. 這個Image對象也是支持with上下文管理器的.
所以打開一個圖像的時候可以直接使用with...as...
語法
pillow模塊的簡單示例
「打開一個圖片文件並顯示」
def show_img()
with Image.open(self.file_path) as img:
img.show()
return img
「生成一個新的純色圖片並保存到文件」
def new_a_image():
img = Image.new('RGB',(253,100),(240,233,204))
img.save('demo.jpg')
「獲取某個像素點的RGB值」
def get_color_from_file(self):
with Image.open(self.file_path) as img:
color = img.getpixel((100, 100))
return color
mongoDB數據庫基本操作
MongoDB是一款開源的,高性能的非關係型數據庫. 也就是傳說中的NoSQL數據庫中的熱門款. 主要以key-value為作為存儲結構.
具體的介紹可以參見這篇博文: Mongodb介紹
這裡簡單介紹一下mongoDB的操作.
MongoDB的安裝和Robo 3T的安裝使用等,已經寫進了我的小本本. 有空再來寫. 今天先簡單介紹一下mongoDB的基本操作.
在python中,我們是使用「pymongo」這個模塊來操作MongoDB數據庫的.
基本使用很簡單,放一小段代碼一看就懂.
import pymongo
MONGO_URL = 'localhost'
MONGO_DB = 'wmcoding_cover'
MONGO_TABLE = 'cover'
# 聲明連接客戶端
client = pymongo.MongoClient(MONGO_URL, connect=False)
# 聲明要操作的數據庫
db = client[MONGO_DB]
# 保存數據到mongoDB. 直接使用insert_one()方法就可以了
def save_to_mongo(self, digest, color, feeling, file_path):
res = {
'digest': digest,
'color': color,
'dscp': feeling,
'path': file_path
}
if db[MONGO_TABLE].insert_one(res):
print('cover save to database successful!')
return True
return False
# 同樣檢索的話,使用find_one()方法,獲取一條記錄. 該記錄會以列表的形式展現
def decode(self):
if self.file_path:
self.color = self.get_color_from_file()
res = db[MONGO_TABLE].find_one({'color': list(self.color)})
return res['dscp']
更多關於mongoDB的操作可以參見崔大佬的文章:Python操作MongoDB看這一篇就夠了
代碼已經上傳到了github,感興趣的可以拿來看一看. Cover Generator
後話
現在這個版本比較簡陋.
下一步的計劃是給它加個GUI的界面.
再下一步的計劃是改成在線版並且跟微信公眾號對接.
實現上傳封面圖後每個關注了公眾號的用戶都可以看到封面背後的”優雅且富有詩韻”的文字…