Python 实现图片转字符画

阅读 2115
收藏 85
2016-11-10
原文链接:www.shiyanlou.com

教程步骤的一些个人理解

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梦。但是效果没有教程里那么好,我猜是教程代码的转换函数写的比较简陋,一些设置没设置到位,导致的。

我之后自己找了个小火车的图片,转换后效果如图:

完成的实验结果

评论