一个毫无用处的公众号封面生成器
对于一个没有任何艺术细胞的人,写公众号最头疼的无异于文章封面了. 要么选不好图,选好图了呢,公众号这个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的界面.
再下一步的计划是改成在线版并且跟微信公众号对接.
实现上传封面图后每个关注了公众号的用户都可以看到封面背后的"优雅且富有诗韵"的文字...