Python 3 图像转彩色字符画 —— 实验一

文章目录

一、课程介绍

本门课程将通过借助 Pillow 库把图像转换成相应样式的彩色字符,并在终端打印出来。

另外通过本门课程我们还将接触到 docopt 库,利用该库我们可以方便快捷地构建起强大的命令行解析器。

本次课程我们将分成两次实验,这是本门课程的第一个实验,在本次实验中我们将学习 docopt 库与 Pillow 库的使用。

提示:如果你对 docopt 与 Pillow 已经有过一些了解,那么你可以跳过本次实验,直接开始第二个实验的学习。

1.1 知识点

学习本门课程的过程中将接触到以下知识:

  • 使用 Pillow 库操作图像

  • 使用 docopt 库构建命令行解析器

  • 使用转义字符改变 Bash 界面中输出的字符样式

1.2 主要流程

本次实验流程如下:

  • 安装依赖模块

  • docopt 使用说明

  • Pillow 使用说明

1.3 效果截图

先放几张我们的图像转换彩色字符程序的效果图。

原图:

此处输入图片的描述

此处输入图片的描述

转换之后的效果图:

此处输入图片的描述

此处输入图片的描述

此处输入图片的描述

二、安装依赖模块

本项目的依赖模块如下:

  • Pillow

  • docopt

2.1 安装 Pillow

由于 Pillow 并不为 Linux 系统提供二进制版本文件,所以我们得通过下载源码自行编译。因此 Pillow 在安装过程中要稍微麻烦些,安装方法如下。

首先,由于实验环境默认的 Python 3 为 Python 3.5 版本。但是实验环境中的源却没有 3.5 版本的开发库,所以首先要将 Python 3 的版本从 3.5 切换至 3.4 。

$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.4 70 --slave /usr/bin/python3m python3m /usr/bin/python3.4m

安装 Python 的开发库 python3-dev 和 python3-setuptools 。

$ sudo apt-get update
$ sudo apt-get install python3-dev python3-setuptools

安装 Pillow 依赖包。

$ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk

最后安装 Pillow 。

$ sudo pip3 install Pillow

2.2 安装 docopt

$ sudo pip3 install docopt

三、docopt 使用说明

docopt 是 Python 的一个第三方参数解析库,可以根据使用者提供的文档描述自动生成解析器。因此使用者可以用它来定义交互参数与解析参数。

接下来我们将通过一个简单的例子来说明 docopt 的使用。

进入 Code 目录中创建程序文件 docopt_demo.py ,可以使用 Vim 或者 gedit 进行编辑。

3.1 docopt 初体验

首先我们先来看看 Demo 程序以及程序运行效果,之后再进行讲解。

docopt_demo.py 的代码如下:

"""
    ###     ####         ######
          ###  ###      #    ###
    ###         ###       ######
    ###      ####       ###   ##
    ###    ####        ###    ##
    ###   ##########    ##### ###

i2a creates ASCII art from images right on your terminal.

Usage: i2a [options] [FILE]

Options:
  -h --help            Show this on screen.
  -v --version         Show version.
  -c --colors          Show colored output.
  -b --bold            Output bold characters
  --bg=(BLACK|WHITE)   Specify the background color.
  --contrast=<factor>  Manually set contrast [default: 1.5].
  --alt-chars          Use an alternate set of characters. 
"""from docopt import docopt

__version__ = 'demo 1.0'if __name__ == '__main__':
    args = docopt(__doc__, version=__version__)
    print(args)

运行命令:

$ python3 docopt_demo.py
$ python3 docopt_demo.py image.png --bold --colors

结果如图。

此处输入图片的描述

运行之后我们发现 docopt 库返回了一个字典,字典中的键由我们给出的 Usage 与 Options 中的选项构成。

再运行命令:

$ python3 docopt_demo.py -h

结果如图。

此处输入图片的描述

我们发现执行 help 选项的时候输出到屏幕的帮助信息就是程序中最开始部分我们用三个双引号包围住的字符串内容。

所以 docopt(__doc__, version=__version__) 函数能自动根据三个双引号中的文档内容(存储于 __doc__ 中)生成命令行解析器,并将解析结果以字典对象返回。所以使用 docopt 进行命令行解析,我们唯一需要做好的事情就是编写好帮助文档,然后其它一切解析的问题都可以甩手给 docopt 自动解决。

3.2 编写帮助文档

首先看看我们前边程序中定义的帮助文档。

"""
    ###     ####         ######
          ###  ###      #    ###
    ###         ###       ######
    ###      ####       ###   ##
    ###    ####        ###    ##
    ###   ##########    ##### ###

i2a creates ASCII art from images right on your terminal.

Usage: i2a [options] [FILE]

Options:
  -h --help            Show this on screen.
  -v --version         Show version.
  -c --colors          Show colored output.
  -b --bold            Output bold characters
  --bg=(BLACK|WHITE)   Specify the background color.
  --contrast=<factor>  Manually set contrast [default: 1.5].
  --alt-chars          Use an alternate set of characters. 
"""

为了使 __doc__ 能引用到帮助文档的内容,帮助文档需要书写在程序的最开始部分并且采用三双引号进行注释。当然,或者你也可以在程序段中通过 __doc__ = """[帮助文档]""" 这种显示赋值的方式为 __doc__ 指定引用内容。

在帮助文档中必须指定 usage 字段, docopt 正是通过 usage 字段确定了命令行参数的格式。 usage 之前的允许有任意多个字符,这些字符可以用来介绍程序信息与作用也可以是任何用于提升帮助文档美观性的字符,因为这些都不会影响到 docopt 的命令行参数解析。

这里我们的 usage 定义为:

Usage: i2a [options] [FILE]

我们的 usage 指定了两个可选参数 [options] 与 [FILE] ,它们分别是参数选项文件路径名

更进一步地,我们紧接着 usage 之后还定义了 options 的内容:

Options:
  -h --help            Show this on screen.
  -v --version         Show version.
  -c --colors          Show colored output.
  -b --bold            Output bold characters
  --bg=(BLACK|WHITE)   Specify the background color.
  --contrast=<factor>  Manually set contrast [default: 1.5].
  --alt-chars          Use an alternate set of characters.

例子中,各符号含义如下:

  • - 描述了选项的短形式

  • -- 描述了选项的长形式

  • () 描述了可选元素

  • | 描述了互斥元素

  • = 描述了选项之后带有参数

  • [defalut: 1.5] 指定了参数的默认值

关于 docopt 的讲解就到这,想了解更多的同学可以自行去 docopt 官网查阅文档。

四、Pillow 使用说明

Pillow 是 Python 的一个强大的图像处理库,它为 Python 提供了额外的文件格式支持和高效的图像表示方法。接下来我们就来看看如何使用 Pillow 进行一些关于图像的简单操作。

首先进入 Python 3 的命令交互界面,执行以下命令:

>>> from PIL import Image>>> im = Image.open("nyan.png")>>> print(im.format, im.size, im.mode)

备注:上述程序使用到的图片可以通过命令 wget http://labfile.oss.aliyuncs.com/courses/673/nyan.png 下载。

执行结果如下:

此处输入图片的描述

Pillow 中最重要的就是 Image 类,上述程序中我们调用了 Image 模块的 open 函数来加载图像信息并返回一个 Image 对象。通过该对象我们可以获取关于该图像的很多信息,比如,文件格式(format)、大小(size)和颜色空间(mode)等。

继续之前的操作。

>>> gray = im.convert('L')

输出:

此处输入图片的描述

这里通过 convert() 方法将 RBGA 图像转换成灰阶图。常见参数有:

  • 'L' :转为灰阶图

  • 'RGBA' :转为 RGBA 图

继续操作。

>>> img = im.getdata()>>> list(img)

输出:

此处输入图片的描述

这里你将看到一个很长很长的 list 输出了,而 list 中每个元素都是一组 tuple 。事实上,每组 tuple 对应图像中一个像素点,而每组 tuple 中又分别包含四个值,分别表示当前图像中某一像素点的 RGBA 四个通道各自的值。

当然,图像 list 中的元素并不总是 tuple ,如果当前图像是灰阶图,则它只有单通道,这意味着每个像素只对应一个值,因此灰阶图的 list 中每个元素就是一个整型值。

此处输入图片的描述

由于 Pillow 中文文档对 Pillow 的使用介绍得非常详细,我这边就不再赘述。感兴趣的同学自行前往学习。

五、总结

本次试验我们简单地介绍了 docopt 与 Pillow 库的使用方法,为下次试验实现图像转彩色字符画打下了基础。

原文链接:,发表于 源代码(CodeBeta),转发请注明来源!

发表评论