目录

 


文章目录

前言

一、本次学习须知

二、项目学习

1.导入库

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

3.清空 tmp 目录下内容

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

5.将图片处理成字符画

 6. 创建新画布

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

8.主函数部分

9.使用项目前需读

        10.具体实现内容

  • 三,总结



前言

  在现代社会,计算机技术正在深刻地影响我们的生活和工作。尤其对于计算机爱好者、程序员和开发者而言,Python编程语言是一个极具吸引力的选择。Python是一种易学易用且功能强大的编程语言,通过实战项目的方式学习Python编程,可以让我们更深入地理解和掌握Python的核心概念和基本语法,帮助我们更快地提升编程技能。因此,在本文中,我们从第一个Python实战项目实战开始学习和使用,希望能对像我一样的初学者有所帮助。

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


一、本次学习须知

本项目较小,具有一定的python基础即可进行学习,初学者也可进行阅读并学习。

本项目分为代码块进行制作笔记与学习。

二、项目学习

1.导入库

代码如下:


 


python根据文字画框_python

 1.os:该库提供了访问操作系统功能的方法,小写字母"o"和字母"s"之间没隔。                        

            在这里,它被用来访问操作系统路径。
2.imageio:该库提供了一组用于读写图像和动态图像格式的函数。

            在这段代码中,它被用来读取   图像文件。
3.PIL:该库是Python用于图像处理和图形操作的第三方库,可以使用各种图像特效处理图像,包              括缩放,旋转,裁剪和滤镜等。

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

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

总结:

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

(2)使用 imageio 库将该图片保存为图像文件。

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

代码如下:

python根据文字画框_python根据文字画框_02

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 目录下内容

代码如下:

python根据文字画框_python_03


 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 字符

代码如下:

python根据文字画框_灰度值_04

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.将图片处理成字符画
 

代码如下:

python根据文字画框_python根据文字画框_05

函数的输入参数包括:

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. 创建新画布

代码如下:

python根据文字画框_Python_06

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

代码如下:

python根据文字画框_灰度值_07

注意:

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.主函数部分

代码如下:

python根据文字画框_python_08

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。

注意:

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

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

9.使用项目前需读

python根据文字画框_灰度值_09

10.具体实现内容

原GIF动态图:

python根据文字画框_灰度值_10

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

python根据文字画框_灰度值_11

 字符动态图:

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

python根据文字画框_python根据文字画框_12

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

三,总结

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

1.导入库

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

3.清空 tmp 目录下内容

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

5.将图片处理成字符画

 6. 创建新画布

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

8.主函数部分

   通过读取 gif 图片进行字符画生成,最后输出字符画效果的 gif 图片。在实现这个项目时,需要先导入需要的库,并将 gif 图片拆分成每一帧,然后将每一帧转化为对应的字符画。在转化时,需要根据灰度值映射对应的 ASCII 字符来完成,这个过程中需要先将图片处理成适合字符画的形式,然后创建新的画布,最终再将所有帧合成输出 gif 图片。