• Python实现图片转字符画


    本文将运用到以下知识点:

    • Pillow库:图片处理
    • 灰度值转字符
    • argparse库:管理命令行参数输入

    完整程序——Python图片转字符画.py

    在cmd中切换到图片文件所在路径,运行python Python图片转字符画.py imagename.png

    imagename为图片的名称。

    from PIL import Image
    import argparse
    
    # 创建实例
    parser = argparse.ArgumentParser()
    
    # 定义输入文件、输出文件、输出字符画的宽和高
    parser.add_argument('file')
    parser.add_argument('-o','--output')
    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;:,"^`'. ")
    def get_char(r, g, b, alpha=256):
        # 判断 alpha 的值
        if alpha == 0:
            return ' '
    
        # 获取字符集的长度
        length = len(ascii_char)
    
        # 将 RGB 值转为灰度值 gray,灰度值范围为 0-255
        gray = int(0.2126*r + 0.7125*g + 0.0722*b)
        unit = (255.0 + 1)/length
        return ascii_char[int(gray/unit)]
    
    if __name__ == '__main__':
        # 打开并调整图片的宽和高
        im = Image.open(IMG)
        # WIDTH, HEIGHT = im.size
        # 调整图片尺寸对应到输出的字符画的宽度和高度, Image.NEAREST 表示输出低质量的图片
        im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
    
        # 初始化输出的字符串
        txt = ""
    
        # 遍历图片中的每一行
        for i in range(HEIGHT):
            # 遍历该行中的每一列
            for j in range(WIDTH):
                # 将(j,i)坐标的 RGB 像素转为字符后添加到 txt 字符串
                txt += get_char(*im.getpixel((j, i)))
    
            # 遍历完一行后需要增加换行符
            txt += '
    '
        # 输出到屏幕
        print(txt)
    
        # 字符画输出到文件
        if OUTPUT:
            with open(OUTPUT, 'w') as f:
                f.write(txt)
        else:
            with open('output.txt','w') as f:
                f.write(txt)
    
    

    主要思路

    1. 利用Pillow模块获取图片RGB属性
    2. 将RGB转换为灰度值,并得到对应的字符
    3. 字符拼接,并输出到文件中

    Pillow库简介

    显示图片

    im = Image.open(IMG)
    im.show()
    

    图片基本属性

    print(im.size,im.format,im.mode)
    # (100,100),PNG,RGB
    

    调整图片大小

    im.resize((w, h), Image.NEAREST)
    

    获取像素点的RGB值,返回一个元组

    im.getpixel((i,j))
    

    获取字符画

    灰度值与RGB简介

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

    RGB:RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

    利用灰度值公式将像素的RGB值映射到灰度值

    gray = 0.0216*r + 0.7125*g + 0.0722*b
    

    然后可以创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号。

    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ")
    

    最后建立灰度值与字符画的映射

    gray = int(0.2126*r + 0.7125*g + 0.0722*b)
    unit = (255.0 + 1)/length
    return ascii_char[int(gray/unit)]
    

    文件保存

    output.txt文件不存在时,创建它;文件存在时,覆盖它。

        # 字符画输出到文件
        if OUTPUT:
            with open(OUTPUT, 'w') as f:
                f.write(txt)
        else:
            with open('output.txt','w') as f:
                f.write(txt)
    

    argparse库命令行输入

    首先利用argparse.ArgumentParser()创建argparse实例,再用add_argument添加命令行参数,其中'--width'前面有--表示可选参数,即在命令行输入命令时可以如下

    python file.py imagename.png 
    python file.py imagename.png --width=100
    
    import argparse
    
    # 创建实例
    parser = argparse.ArgumentParser()
    
    # 定义输入文件、输出文件、输出字符画的宽和高
    parser.add_argument('file')
    parser.add_argument('-o','--output')
    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
    

    参考:https://www.lanqiao.cn/courses/370

  • 相关阅读:
    Windows FFMPEG开发环境配置
    双网卡单IP实现网卡冗余与负载均衡
    Thinking in Java 4th(Java编程思想第四版)文档、源码、习题答案(偶尔回顾)
    IDEA编译时出现 Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8
    运行java飞行记录器JFR(java flight recorder)
    Java黑科技之源:JVMTI完全解读
    jvisualvm安装visualgc插件
    系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
    Jenkins 改成中文语言显示
    windows上Jenkins安装及其配置
  • 原文地址:https://www.cnblogs.com/augustine0654/p/14806577.html
Copyright © 2020-2023  润新知