1. 程式人生 > >一個毫無用處的公眾號封面生成器

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

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

對於一個沒有任何藝術細胞的人,寫公眾號最頭疼的無異於文章封面了. 要麼選不好圖,選好圖了呢,公眾號這個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的介面.

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

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