思路
逐行扫描图片的像素点 获取RGB参数 转换为灰度值 根据灰度值 转换为字符
需要用到的库
PIL的image模块 命令行解析库 argparse
先完成get_ascii的操作,即将RGB值转换为灰度值再根据获取到的灰度值取得字符列表中对应的列表
代码如下
写的时候,我发现unit的值是个浮点数,而我们需要整形数值,于是对unit进行整形变换就OK了
下一步需要写主函数的内容,这里需要的注意的是,python程序是脚本语言,没有固定的入口,不像其它变成语言那样,会编译成二进制再运行,而是会逐行运行,所以没有固定的入口。
所以,想要让程序再被调用的时候,而不是作为模块调用的时候执行我们想要的代码
那么需要写
if __name__ == '__main__‘:
即可实现
下面就需要读图片,为了使最后生成的字符画能够完整的显示出来,还需要调整大小,具体代码如下
这里需要注意的是,PIL库中的Image类中的resize接受一个元组,还可以加参数调整图片的质量
Image.NEAREST | 低质量 |
Image.BILINEAR | 双线性 |
Image.BICUBIC | 三次样条插值 |
Image.ANTIALIAS | 高质量 |
若不添加,图片质量默认为NEAREAST
接下来就是执行逐行扫描了,将获取到的RGB值转换为灰度值 从而替换为字符串形成字符画,代码如下
这里需要注意的是,getpixel函数接受的是一个元组。
然后就需要输出文件啦,利用with..as..
with as相比常规获取文件句柄打开文件然后关闭文件句柄的操作来说,代码简洁,不易出错,可以处理异常
with as语句with后面跟的语句必须有一个__enter__()方法与__exit__()方法,恰好文件句柄操作就拥有这两个特性
with 会将紧跟其后的语句进行求值,将__enter__()方法返回的值赋给as后面的变量,with后面的代码块都被执行完毕之后,就会进行__exit__()方法的执行。
下面就是命令行解析库argparse的应用
使用argparse前需要初始化
parser = argparse.ArgumentParser()即完成初始化
对parse对象进行操作
parser.add_argument()添加命令行参数,参数一般为需要用户输入的参量,参量的默认类型,参量的默认取值。
不加-添加参量即为必选参量,添加-为参量缩写 类似-h的应用,添加--为可选参量,一般这样的参量后都有默认值
设置好参数后,还要将parser.parse_args()返回的对象赋给变量,以便将获取到的值赋给我们定义的变量。
至此,一个可供用户操作的输出字符画的程序就完成了