一個毫無用處的公眾號封面生成器

  • 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的界面.

再下一步的計劃是改成在線版並且跟微信公眾號對接.

實現上傳封面圖後每個關注了公眾號的用戶都可以看到封面背後的”優雅且富有詩韻”的文字…