python实现Gif图片的字符画

简介: 这是一个Python实战项目,旨在将GIF动态图转化为ASCII字符动画。项目适合有一定Python基础的学习者,主要使用os、imageio、PIL库。首先,代码导入所需库,然后通过PIL创建空白图片并添加文本。接着,程序读取GIF,拆分帧并转为字符画,存入“tmp”目录。同时,代码提供了清空“tmp”目录、将灰度值映射为ASCII字符、将图片处理成字符画的函数。此外,还有创建新画布和合成GIF的步骤。主函数调用这些模块,最终将ASCII字符画合并成GIF。项目展示了将动态图像转换为ASCII艺术的过程。

版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文首发链接:https://blog.csdn.net/weixin_72543266/article/details/131057166​

前言

Python编程语言在工具开发占有优势。Python是一种易学易用且功能强大的编程语言,通过实战项目的方式学习Python编程,可以让我们更深入地理解和掌握Python的核心概念和基本语法,帮助我们更快地提升编程技能。因此,在本文中,我从第一个Python实战项目实战开始学习和使用,希望能对像我一样的初学者有所帮助。

     本项目为本人第一次学习并编写的,作为自己的学习笔记,如有可改进的地方,望各为大佬指正,感谢!

一、本次学习须知

本项目较小,具有一定的python基础即可进行学习,初学者也可进行阅读并学习,本项目分为代码块进行制作笔记与学习。

二、项目学习

1.导入库

代码如下:

image.png

代码解释

1.os:该库提供了访问操作系统功能的方法,小写字母"o"和字母"s"之间没隔。 在这里,它被用来访问操作系统路径。
2.imageio:该库提供了一组用于读写图像和动态图像格式的函数。在这段代码中,它被用来读取图像文件。
3.PIL:该库是Python用于图像处理和图形操作的第三方库,可以使用各种图像特效处理图像,包括缩放,旋转,裁剪和滤镜等。

        在这段代码中,它被用来创建一个新图像,并在其上绘制文本。

                   下面是PIL库中的一些核心模块:

(1)Image:提供了一系列操作图像的类和方法,包括打开、保存、修改图像大小、裁剪等。
(2)ImageDraw:提供了绘制基本几何图形和文本的方法,例如绘制线、矩形、圆等。
(3)ImageFont:提供了字体选择、大小和渲染的功能,例如在图像中添加文本或标注。

代码总结:

(1)该代码的功能是使用PIL库创建一个空白图片,然后将文本写在图片上。
(2)使用 imageio 库将该图片保存为图像文件。

2.拆分 gif 将每一帧处理成字符画

代码如下:

image.png

代码解释:

1.打开一个名为 file 的图像文件,并将其加载到变量 im 中(使用 PIL 库中的 Image.open() 方法)。
2.存储当前工作目录到变量 path 中(使用 os.getcwd() 方法)。
3.如果不存在名为 “tmp” 的子目录,则创建一个新的目录 “tmp”(使用 os.mkdir() 方法)。
4.更改工作目录到新创建的 “tmp” 目录中(使用 os.chdir() 方法)。

代码总结:

(1)这段代码的作用是将当前工作目录更改为一个名为 “tmp” 的子目录,并在其中打开名为 file 的图像文件。
(2)它还为了确保 tmp 目录存在而创建了该目录,因此可以保证程序能够顺利地进行文件操作。

3.清空 tmp 目录下内容

代码如下:

image.png

代码解释

1.遍历目录中名为 “tmp” 的文件夹中的所有文件,并使用 os.remove() 方法删除所有文件。
2.在 try 块中执行以下操作:
3.使用 im.tell() 方法获取当前帧的帧数。
4.使用当前帧编号生成一个新的文件名。
5.使用 im.save() 方法将当前帧保存为 PNG 图像文件。
6.调用名为 imgascii() 的函数,将 PNG 图像转换为 ASCII 字符画。
7.使用 im.seek() 方法选择下一帧图像。
8.最后,当所有图像帧被处理后,使用 os.chdir() 方法恢复原始的工作目录。

代码总结:

(1)这段代码使用了 os 模块中的 listdir()和remove() 方法,并使用了 try/except块来捕获可能发生的异常。
(2)这段代码的作用是将读取到的图像文件转换为ASCII字符画,并将其保存到一个名为 “tmp”的临时目录中。
(3)它使用了 os 和 PIL 库来完成各种文件和图像处理任务。

4.将不同的灰度值映射为 ASCII 字符

代码如下:

image.png

代码解释:

1.获取 ASCII 字符列表的长度。
2.计算当前像素的灰度值,公式为:灰度值=0.2126R + 0.7152G + 0.0722*B。
3.使用灰度值将整个灰度范围分成若干等份,每份长度为 256/长度,然后根据当前像素的灰度值,选择相应的字符。
灰度值小于等于 x 的像素将被映射到 ASCII 字符列表的第 x 个字符。
4.返回选择的 ASCII 字符。

代码总结:

(1)这段代码定义了一个名为 get_char() 的函数,可以接收三个参数:一个包含 ASCII 字符的字符串列表,以及 RGB 色彩空间中的 R、G和B值。
(2)该函数将根据每个像素的灰度值选择一个相应的 ASCII 字符,并返回该字符。
(3)这个函数通常用于将彩色图像转换为 ASCII 字符画时,在每个像素上进行灰度值计算,然后将其转换为表示该像素的 ASCII 字符。

5.将图片处理成字符画

代码如下:

​​image.png

代码解释:

函数的输入参数包括:

1.img: 字符串,代表输入的图片文件路径。
2.ascii_chars: 字符串,包含了预先定义好的 ASCII 字符集合,用于生成字符画。例,可以使用 ‘@#S%?*+;:,.’,表示不同的灰度值对应不同的字符。
3.isrgb: 布尔值,表示输入的图片是否是灰度图像。
4.font: 字体对象,用于计算字符的尺寸。
5.scale: 浮点数,用于控制输出的字符画的大小,通过缩放原始图片来实现。

函数主要的处理过程包括:
1.打开输入的图片文件,并将其转换为 RGB 模式。
2.根据输入的 scale 参数计算出字符画的大小,并确定每个单元的大小。
3.对图片进行缩放,将每个缩小后的单元代表为对应的 RGB 值。
4.根据 RGB 值,在 ASCII 字符集中找到对应的字符,并将其添加到 txts 列表中。
5.同时将 RGB 值添加到 colors 列表中。
6.最后返回生成的 txts 和 colors 列表。

代码总结:

函数依赖于 PIL 或者 Pillow 库来实现图片的处理。用于将一张图片转换为对应的 ASCII 字符画。

6. 创建新画布

代码如下:

image.png

代码解释

1.根据前面处理生成的 txts 和 colors 列表,创建了一个新的 RGB 模式的画布 img_txt,并使用白色作为背景填充。
2.创建了一个 ImageDraw 对象 draw,用于在画布上绘制字符。
3.遍历 txts 中的每一个字符,将其依次绘制到画布上,并根据 isrgb 参数决定字符的颜色。
4.如果 isrgb 为 True,则使用 (119, 136, 153) 这个灰色作为字符的颜色,否则使用对应位置的 colors[j][i] 颜色值作为字符的颜色。
5.使用 img_txt.save(img) 将生成的图片保存到指定的文件路径 img 中。
注意:如果 img 参数与之前输入的图片路径参数不同,会覆盖之前的图片文件。另外,该函数需要 PIL 或者 Pillow 库的支持来执行图片的保存操作。

代码总结:

这段代码是用于将生成的 ASCII 字符画输出到文件中的部分。

7.读取 tmp 目录下文件合成 gif

代码如下:

image.png

注意!!!:

1.该代码需要依赖于 imageio 库来实现图片的读取与保存。
2.执行该代码前需要确保 dir_name 参数指定的目录下已经存在包含多张 ASCII 字符画的文件。

代码解释:

1.通过 os.getcwd() 获取当前工作路径,然后通过 os.chdir(dir_name) 进入到指定的目录 dir_name 下。
2.使用 os.listdir() 获取该目录下的所有文件名,并遍历每一个文件名,通过 imageio.v2.imread(d) 读取相应的文件并添加到 images 列表中。
3.通过 os.chdir(path) 切换回之前的工作路径。
4.调用 imageio.v2.mimsave(out_name + ‘_character’, images, duration=duration) 将 images 列表中的所有图片合成为一个 GIF 动画,并将其保存到 out_name 参数指定的文件路径中。
5.其中,duration 参数用于指定每一帧图片的显示时长。

代码总结:

这段代码是用于将输入目录 dir_name 中的多张 ASCII 字符画合成为一个 GIF 动画输出的部分。

8.主函数部分

代码如下:

image.png

注意:

1.该程序需要先执行 gifpic 函数才能接着执行 picgif 函数,因为后者需要依赖于前者生成的字符画文件。
2.在执行该段代码前需要确保存在名为 “Courier-New.ttf” 的字体文件,以及名为 “g1.gif” 的输入文件。

代码解释:

1.定义了 ascii_chars、fname、font 三个变量,用于控制生成 ASCII 字符画的字符集、输出文件名和字体等参数。
2.通过 ImageFont.truetype(‘Courier-New.ttf’, size=int(6)) 加载了 Courier New 字体,并指定了字符的大小为 6。
3.执行了两个函数,首先调用 gifpic 函数生成 ASCII 字符画,并输出到临时目录 tmp 下的多张文件中。
4.调用 picgif 函数将 tmp 目录下的多张 ASCII 字符画合成为一个 GIF 动画输出。该 GIF 的文件名为 fname + ‘_character.gif’,每一帧图片的显示时长为 0.2s。

代码总结:

这段代码是主函数部分,包含了程序的执行入口。

9.使用项目前需读

image.png

10.具体实现内容
原GIF动态图:
ed9569284cb3494da391a774d0bce4bb.gif

代码处理后的每一帧的字符图:

image.png

字符动态图:
89005c946d9e46c5893fe16773ba1673.gif

image.png

字符动图会在第一次打开文章时展示一次然后会暂停:可自行下载观看,内容为上述图片的每一帧合成。

使用ctf工具Stegsolve中的analyse中的frame Browser观察图层。上述每一帧字符画图片为图的每一层转化而成(有多少图层就有多少帧)。

三,总结
有八个不同的模块共同构成了这个项目:

1.导入库
2.拆分 gif 将每一帧处理成字符画
3.清空 tmp 目录下内容
4.将不同的灰度值映射为 ASCII 字符
5.将图片处理成字符画
6 创建新画布
7.读取 tmp 目录下文件合成 gif
8.主函数部分

在实际运用中,这个项目可以用来动态展示封面或者广告横幅等。

以上就是今天学习的内容,介绍了项目代码学习的每一个模块,python库是我们学习和使用的一种便利工具需要多加学习。

相关文章
|
29天前
|
存储 Python
python实现图片与视频转换:将视频保存为图片,将批量图片保存为视频
python实现图片与视频转换:将视频保存为图片,将批量图片保存为视频
|
2天前
|
计算机视觉 Python
Python的三种方式显示图片
Python的三种方式显示图片
|
24天前
|
计算机视觉 Python
【干货】Python玩转各种多媒体,视频、音频到图片
【干货】Python玩转各种多媒体,视频、音频到图片
22 1
|
29天前
|
Python
图片相似度比较_python
图片相似度比较_python
19 1
Python----统计字符串中的英文字母、空格、数字和其它字符的个数。
Python----统计字符串中的英文字母、空格、数字和其它字符的个数。
|
12天前
|
数据采集 Web App开发 iOS开发
经验大分享:Python抓取糗事百科成人版图片
经验大分享:Python抓取糗事百科成人版图片
13 0
|
14天前
|
数据采集 XML 存储
【Python实战】Python多线程批量采集图片
【Python实战】Python多线程批量采集图片
|
24天前
|
数据采集 机器学习/深度学习 搜索推荐
Python第一章(图片与API接口)
Python第一章(图片与API接口)
|
26天前
|
开发工具 Python
[oeasy]python0021_宝剑镶宝石_爱之石中剑_批量替换_特殊字符_特殊颜色
在这个文本中,作者描述了一个逐步修改Python游戏`game.py`的过程,以将小丑的眼睛和石中剑的图形替换为爱心符号,并且将其颜色更改为红色。以下是内容的摘要: - 用户回顾了之前对`game.py`的分析和理解。 - 通过使用方向键和编辑模式,在代码中找到了小丑眼睛和石中剑的位置,用爱心符号(❤)替换了它们。 - 如果遇到问题,建议使用最新版的火狐浏览器进行粘贴操作。 - 使用Vim编辑器的命令模式批量替换了剑柄上的数字8为爱心,使整个剑柄充满了爱心。 - 通过插入特定代码,将爱心变为红色,从而得到红色的“爱之大剑”。
17 0
|
29天前
|
机器学习/深度学习 算法 数据可视化
【深度学习实战】基于深度学习的图片风格快速迁移软件(Python源码+UI界面)
【深度学习实战】基于深度学习的图片风格快速迁移软件(Python源码+UI界面)