python字符画的图怎么保存_Python 实现图片转字符画

图片转字符画(RGB转字符)

首先必要的库:

pillow库---图像处理库PIL

argparse库---管理命令行输入的库

argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息

使用方法:

创建 ArgumentParser() 对象

调用 add_argument() 方法添加参数

使用 parse_args() 解析添加的参数

第二、用 argparse 处理命令行参数,来获取输入的图片路径、输出字符画的宽和高以及输出文件的路径

如上介绍add_argument()用于添加参数。运行程序时,给定参数,通过调用给定的参数执行程序。

from PIL import Image

import argparse

#注意如下代码的整体含义,对照如上argparse库使用方法

#命令行输入参数处理1.创建对象

parser = argparse.ArgumentParser()

#2.添加参数

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) #输出字符画高

# 3.解析添加的参数并获取

args = parser.parse_args()

IMG = args.file #输入图片路径

WIDTH = args.width#输出字符画宽度

HEIGHT = args.height#输出字符画高度

OUTPUT = args.output#输出字符画路径

第三、RGB转字符的函数定义。将 RGB 值转为灰度值,然后使用灰度值映射到字符列表中的某个字符。(256个灰度映射到70个字符上)

先明确灰度值

灰度值通常划分成0到255共256个级别,其中0最暗(全黑),255最亮(全白)。

alpha 值:alpha 值为 0 的时候表示图片中该位置为空白

Alpha值就是用于描述透明度的参量。但凡图像都会涉及到透明度问题。使用透明度之后就可以看到多层图像。Alpha值是一个百分数,alpha=1表示源文件发出的光全部被观察者观察到。计算alfa值必须先把原像素和目标像素的RGB三个颜色分量分离。然后把原像素的三个颜色分量分别乘以α值,并且把目标像素的三个颜色分量分别乘以α的反值,接下来把结果按照对应颜色分量相加,在对最后求得的每个分量结果除以alpha的最大值。

0.2126 * r + 0.7152 * g + 0.0722 * b为官方提供的灰度计算公式,unit表示一个单元占多少灰度,gray/unit可以找到对应的单元,从而转换为字符。

unit = (256.0 + 1)/length

+1应该是为了保证正确性,()内值过小的话,后面在字符对应的时候会出现大于69的数值,在ascii_char中找不到对应数值的字符(借鉴他人方便理解)

一个字符对应的值 区间宽度= 256/字符集长度。比如我们用小写英文26字母作为我们的字符集。字符集容量为26。这里的区间宽度为256/26=9.8

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)]

第四、处理图片

python中with open() as 用法

打开文件后自动关闭,不用我们手动close关闭文件,以防忘记关文件

image.open(路径)是image模块中open用法,打开一个文件

图片的处理步骤如下:

1. 首先使用 PIL 的 Image.open 打开图片文件,获得对象 im

2.使用 PIL 库的 im.resize() 调整图片大小对应到输出的字符画的宽度和高度,注意这个函数第二个参数使用 Image.NEAREST,表示输出低质量的图片。

3.遍历提取图片中每行的像素的 RGB 值,调用 getchar 转成对应的字符

4.将所有的像素对应的字符拼接在一起成为一个字符串 txt

5.打印输出字符串 txt

6.如果执行时配置了输出文件,将打开文件将 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 += '\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)

第五,输出字符画

编写好转换代码之后,下载图片地址。终端解析完后,会显示出来已保存为什么文件(保存的文件名称)。然后执行如下代码,输出字符画:

python3 ascii.py 文件名

再打开output.txt可以查看。

vim output.txt i esc :q

你可能感兴趣的:(python字符画的图怎么保存)