python实战项目1—字符画

目录

 


前言

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

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


一、本次学习须知

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

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

二、项目学习

1.导入库

代码如下:

 

bcfdaea3b4ff4dd8b4dbb684ee114736.png

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

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

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

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

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

总结:

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

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

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

代码如下:

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

代码如下:

8edd81ea18854be995ec4e95592a3731.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 字符

代码如下:

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

代码如下:

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

代码如下:

df7cdc1cc18945088e7a5f630afb728e.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

代码如下:

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

代码如下:

6542555906ef48a88b61ad87fe578ccf.png

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.使用项目前需读

ea2066ca2601463e857eae14ca73a3ed.png

10.具体实现内容

原GIF动态图:

ed9569284cb3494da391a774d0bce4bb.gif

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

2436dd014e5e4029a7a2f3e54c41606a.png

 字符动态图:

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

   89005c946d9e46c5893fe16773ba1673.gif   

   

0edc9410431047d9b6f37b0e99cb5c33.png

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

三,总结

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

1.导入库

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

3.清空 tmp 目录下内容

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

5.将图片处理成字符画

 6. 创建新画布

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

8.主函数部分

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

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

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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XError_xiaoyu

你的支持,使我更好的创作

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值