zoukankan      html  css  js  c++  java
  • 五分钟30行代码使用Python制作熊猫表情包(图片字符化)(附有源码逐行分析)

    @

    一.Demo

    相信许多的小伙伴在平时玩QQ的时候都有发过这样一张表情包,如下:
    在这里插入图片描述
    它其实是由下面的一张表情包演化而来。
    在这里插入图片描述
    今天我们就来教大家如何制作它。

    二.程序演示加讲解

    # coding=utf-8
    from PIL import Image
    import argparse
    
    #----------------------------------------------#
    #命令行输入参数处理
    #----------------------------------------------#
    
    #构建命令行输入参数处理ArgumentParser实例
    parser = argparse.ArgumentParser()
    
    #输入文件
    parser.add_argument('file', default='D:/课程/python/image/myimage1.jpg')
    
    #输出文件
    parser.add_argument('--output', default=0)
    
    #输出文件的宽
    parser.add_argument('--width', type=int, default=80)
    #输出文件的高
    parser.add_argument('--height', type=int, default=80)
    
    
    #-----------------------------------------------#
    # 获取参数
    #-----------------------------------------------#
    
    #解析并获取参数
    args = parser.parse_args()
    
    #输入的图片路径
    IMG = args.file
    #输入的图片宽度
    WIDTH = args.width
    #输入的图片高度
    HEIGHT = args.height
    #输出字符画的路径
    OUTPUT = args.output
    
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'.")
    
    #----------------------------------------------#
    #将256灰度映射到70个字符上
    #----------------------------------------------#
    def get_char(r, g, b, alpha=256):
        if alpha == 0:
            return ' '
        length = len(ascii_char)
        
        #RGB转灰度值
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    
        unit = (256.0 + 1) / length
        return ascii_char[int(gray / unit)]
    
    
    if __name__ == '__main__':
        rgb_im = Image.open(IMG)
        im = rgb_im.convert('RGB')
        im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
        txt = ""
    
        for i in range(HEIGHT):
            for j in range(WIDTH):
                txt += get_char(*im.getpixel((j, i)))
            txt += '
    '
        print(txt)
    
    

    我们在Pycharm中的Terminal,先进入我们项目所在地,然后输入如下命令进行传参运行。

    python 01.py D:/课程/python/image/myimage1.jpg --output=0 --width=45 --height=20
    

    在这里插入图片描述
    我们就能将我们的图片数字化。
    下面是博主亲自实验得出的图片:
    在这里插入图片描述

    三.分析程序

    补充的知识:

    灰度值:指黑白图像中点的颜色深度,范围从0到255,白色为255,黑色为0,所以黑白图片也称灰度图像。

    RGB:red,green,blue,三原色,人们日常所能看到的颜色都是由三原色组成

    我们的实验原理就是将RGB值映射到灰度值上

    我们建立一张列表,灰度值小的在列表的开头,灰度值大的作为列表的结尾。这样就能建立起原图与数字化图片之间的联系。

    (1)主函数:

    Image.open(file)

    返回一张图片,file为文件存储路径

    rgb_im.convert(mode)

    返回一张图片,图片经过格式转换,mode为一种颜色转换模板。
    (其他参数,dither:控制颜色抖动,palette:调动调色板,Color:控制调色板的颜色数目,最大有256种)

    im.resize(size, filter)

    返回一张图片,变量size是所要求的尺寸,是一个二元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。

    (2)RGB转灰度值

    alpha=0 表示空白
    最大为alpha = 255

    (3)灰度值转换成字符

    im.getpixel((j,i)) 获取得到坐标 (j,i) 位置的 RGB 像素值(但是有的时候会包含 alpha 值),返回的结果是一个元组.* 可以将元组作为参数传递给 get_char,同时元组中的每个元素都对应到 get_char 函数的每个参数。

    (4)当然,如果我们想要以文件的形式输出,可以加入使用下面的程序

        if OUTPUT:
            with open(OUTPUT, 'w') as f:
                f.write(txt)
        else:
            with open("output.txt", 'w') as f:
                f.write(txt)
    

    四.注意事项

    我们在用命令行运行程序的时候,不能写入file=,当然,也不能写成文件路径带有双引号或者单引号,参数之间用空格键隔开。
    在这里插入图片描述

    五.程序的改进

    我们可以通过改变ascii_char的值,来改变我们的程序,使得效果最佳。
    小技巧:我们可以使得相同或相近的颜色区域字符相同,这样能得到好的效果。如下:
    在这里插入图片描述

    在这里插入图片描述

    永远热泪盈眶。
  • 相关阅读:
    C#中正则表达式的使用
    Asp.Net MVC 身份验证-Forms
    ASP.NET MVC:窗体身份验证及角色权限管理示例
    asp.net mvc forms身份认证
    ASP.NET MVC Form验证
    C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
    参考例子,学习Func<T, TResult>委托
    Razor 中的@helper 与 @function 用法
    @Helper辅助方法和@functions自定义函数
    ASP.NET MVC传递参数(model), 如何保持TempData的持久性
  • 原文地址:https://www.cnblogs.com/2021WGF/p/14563025.html
Copyright © 2011-2022 走看看