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

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

對於一個沒有任何藝術細胞的人,寫公衆號最頭疼的無異於文章封面了. 要麼選很差圖,選好圖了呢,公衆號這個2.35:1的詭異比例還會涉及到裁剪的問題...html

因此或許你已經發現了,個人文章封面很簡單. 純色圖片避免了裁剪的問題,成爲那些飈設計感和美感的妖豔貨色中的一股清流python

可是隻是純色的圖片,貌似沒有靈魂.git

今天要作的事情就是給個人清流般的封面注入靈魂.github

一個極其不規範的類圖

下面是一個不規範的類圖示例,請你們不要學習.web

封面生成
封面生成
解碼模塊
解碼模塊

思路總結

其實思路很簡單算法

  • 獲取一段文字,解碼爲UTF-8的二進制串
  • 將解碼後的二進制串進行md5摘要,得到一個128位的digest
  • 經過random.randomint()方法在這個128位的二進制串上 隨機選取3個字節作RGB顏色.
  • 生成一個253*100的圖片保存到本地.同時將相關信息存入mongoDB數據庫.

所謂的解碼就更簡單了,衆所周知MD5算法是不可逆的...再加上當初我是隨機取的三個字節,因此想經過顏色來解碼是不可能的.數據庫

可是!!! 我有一個絕妙的辦法...由於以前相關信息已經存到了數據庫裏,因此咱們直接在數據庫裏檢索顏色的RGB值就能夠了.(我簡直不要太機智)數組

知識點總結

注意,乾貨來了!!!微信

輸入內容的處理

輸入內容處理想對比較簡單dom

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

再下一步的計劃是改爲在線版而且跟微信公衆號對接.

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

相關文章
相關標籤/搜索