zoukankan      html  css  js  c++  java
  • Python 【图片转字符画】

    一.安装的第三方模块

    $ sudo pip3 install --upgrade pip
    $ sudo pip3 install pillow
    
    //window
    
    pip3 install pillow

    二.RGB转换为黑白度的简单公式

    gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

    三.新建py文件

        1.首先导入第三方模块

    from PIL import Image
    import argparse

        2.获取图片信息

    使用 argparse 处理命令行参数,目标是获取输入的图片路径、输出字符画的宽和高以及输出文件的路径
    # 首先,构建命令行输入参数处理 ArgumentParser 实例
    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

      

       3.RGB转字符函数

    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ") //使用的字符集
    def get_char(r,g,b,alpha = 256):
    
        # 判断 alpha 值
        if alpha == 0:
            return ' '
    
        # 获取字符集的长度,这里为 70
        length = len(ascii_char)
    
        # 将 RGB 值转为灰度值 gray,灰度值范围为 0-255
        gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    
        # 灰度值范围为 0-255,而字符集只有 70
        # 需要进行如下处理才能将灰度值映射到指定的字符上
        unit = (256.0 + 1)/length
    
        # 返回灰度值对应的字符
        return ascii_char[int(gray/unit)]

      

       4.图片处理

    步骤:
    1.首先使用 PIL 的 Image.open 打开图片文件,获得对象 im
    2.使用 PIL 库的 im.resize() 调整图片大小对应到输出的字符画的宽度和高度,注意这3.个函数第二个参数使用 Image.NEAREST,表示输出低质量的图片。
    4.遍历提取图片中每行的像素的 RGB 值,调用 getchar 转成对应的字符
    5.将所有的像素对应的字符拼接在一起成为一个字符串 txt
    6.打印输出字符串 txt
    7.如果执行时配置了输出文件,将打开文件将 txt 输出到文件,如果没有,则默认输出到 output.txt 文件
    if __name__ == '__main__':
    
        # 打开并调整图片的宽和高
        im = Image.open(IMG)
        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)
    View Code

       5.整体代码

    # -*- coding=utf-8 -*-
    
    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;:,"^`'. ")
    
    # 将256灰度映射到70个字符上
    def get_char(r,g,b,alpha = 256):
        if alpha == 0:
            return ' '
        length = len(ascii_char)
        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__':
    
        im = Image.open(IMG)
        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)
    
        #字符画输出到文件
        if OUTPUT:
            with open(OUTPUT,'w') as f:
                f.write(txt)
        else:
            with open("output.txt",'w') as f:
                f.write(txt)
    View Code

      

  • 相关阅读:
    phpStorm激活码
    找回自己
    延迟加载JavaScript
    [MAC]如何通过 macOS 恢复功能重新安装 macOS
    Realm JavaScript
    Realm .NET
    [MAC]获得在线帮助:恢复信息
    [Swift]UILabel文字截断
    算法和数据结构可视化
    Realm Swift
  • 原文地址:https://www.cnblogs.com/Crown-V/p/12376250.html
Copyright © 2011-2022 走看看