zoukankan      html  css  js  c++  java
  • 一个毫无用处的公众号封面生成器

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

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

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

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

  • 相关阅读:
    TCP/IP 协议简介
    制作html的旋转太极图
    Redis高可用
    RFID固定资产管理系统解决方案
    为什么要用三维数据可视化?
    Java单元测试技巧之PowerMock
    技术干货 | 如何在 Library 中使用/依赖 mPaaS?
    云原生的进一步具象化
    【阿里云EMR实战篇】以EMR测试集群版本为例,详解 Flink SQL Client 集成 Hive 使用步骤
    【实践案例】Databricks 数据洞察 Delta Lake 在基智科技(STEPONE)的应用实践
  • 原文地址:https://www.cnblogs.com/thecatcher/p/12500831.html
Copyright © 2011-2022 走看看