Loading

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 += '\n'
    # 输出到屏幕
    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

posted @ 2021-05-24 22:39  紫曜花  阅读(602)  评论(0编辑  收藏  举报