教程步骤的一些个人理解
1.安装python开发环境和工具包pillow(PIL)
1.1、什么PIL:
-即Python Imagine Library,是一个python常用的图像处理工具包。
1.2、什么是pillow:
-PIL库只支持到Python2.7版就停止更新了,然后某些人在PIL的代码基础上修改了PIL的一些bug,且继续更新支持Python3.x。可以说pillow就是改进版的PIL库。
1.3、为什么要安装pillow(PIL):
-我们安装了pillow之后可以在代码中使用这个工具包中的写好的特定方法,完成对图像的处理,而不用我们自己去实现图片处理。
1.4、安装PIL的代码的含义:
-sodu是获取管理员权限,apt-get是linux系统更新、安装、卸载软件等操作的命令头,一般需要root权限,所以一般此命令头前都会加sudo
sudo apt-get update
-上面这个命令的含义是:更新软件包列表。目的是为了能获取到想安装的软件的最新版本,最好每次安装前都update一下,不然安装软件可能会出错
sudo apt-get install python-dev
-上面这个命令的含义是:安装python-dev包。
-为什么要装这个包:
linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包
可见我们在实验楼的默认开发环境中,如果想用python命令的话,还是需要加上这个库的。
sudo apt-get install libtiff5-dev libjpeg8-dev ...... python-tk
-上面这个命令的含义是:安装一些图像相关的依赖包,貌似是辅助pillow用的?
sudo pip install pillow
-上面这个命令的含义是:用pip管理器安装pillow工具包
至此,python环境和pillow工具包都安装完了,可以去尝试编写图像转字符画的.py脚本了。
2.编写转换脚本ascii.py
2.1、获取要转换的图片
wget http://labfile.oss.aliyuncs.com/courses/370/ascii_dora.png
-上面这个命令的含义是:从那个http地址下载要转换的图片(就是教程中的哆啦A梦图片)
2.2、编写转换脚本
-首先,创建脚本文件
>vi ascii.py
这是个vim命令,和在windows上用记事本创建一个ascii.txt的含义差不多,只不过因为是python脚本,所以文件类型后缀是.py。
话说,如果不知道vim是什么和怎么用,请参考实验楼的vim教程
-然后开始写转换代码,我们来一一讲解代码含义
sfrom PIL import Image
import argparse
上面这段代码的含义是:
引用PIL的Image库,引用python标准库中的argparse模块(argparse的使用请参考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) #输出字符画高
上面这段代码的含义是:
设置命令行可输入的参数,有4种,file(要转换的文件地址)、-o(转换后的字符画保存文件地址)、--width(输出字符画的宽度)、--height(输出字符画的高度)
如果你看了Argparse简易教程,你就知道这么写是什么意思了。我先说一下,最后我们写完脚本后执行的命令是:
$ python ascii.py ascii_dora.png
后面那个参数ascii_dora.png就是file参数的值。那为什么输出文件、宽、高都不用设置呢,因为在上面那段代码中设置了默认值,默认输出宽、高都为80,默认输出到"output.txt"(这个输出地址是代码后面设置的,我先在这说明一下)
>#获取参数
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
上面这段代码的含义是:获取输入的参数值,没什么好说的。
#获取参数
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
上面这段代码的含义是:
1.设置字符画的字符集,就是用哪些字符来组成字符画
2.def get_char是一个图片颜色转换成字符的方法。(具体为什这么计算我也不懂)但这个方法的含义就是把某颜色值转成对应的字符,返回转换后的字符
">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 += '\n'
print txt
上面这段代码的含义是:
对打开的图片的每个坐标(i,j)的颜色做判断,用之前我们定义的方法get_char()获取颜色对应的字符,然后拼接成字符串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)
上面这段代码的含义是:
如果给了输出文件地址,则将字符串保存到给定的文件里。
如果没给,保存到"output.txt"这个文件里。
2.3、运行一下刚才写完的转换脚本
>python ascii.py ascii_dora.png
效果就是教程里的图片那样了,哆啦A梦变成了字符画的哆啦A梦。但是效果没有教程里那么好,我猜是教程代码的转换函数写的比较简陋,一些设置没设置到位,导致的。
我之后自己找了个小火车的图片,转换后效果如图: