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

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

对于一个没有任何艺术细胞的人,写公众号最头疼的无异于文章封面了. 要么选很差图,选好图了呢,公众号这个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的界面.

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

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

相关文章
相关标签/搜索