一个毫无用处的公众号封面生成器

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

再下一步的计划是改成在线版并且跟微信公众号对接.

实现上传封面图后每个关注了公众号的用户都可以看到封面背后的”优雅且富有诗韵”的文字…