> 文章列表 > Python教程:如何用PIL将图片转换为ASCII艺术

Python教程:如何用PIL将图片转换为ASCII艺术

Python教程:如何用PIL将图片转换为ASCII艺术

Python教程:如何用PIL将图片转换为ASCII艺术

ASCII 艺术是一种将图像转换为由字符组成的艺术形式。Python 是一种灵活而强大的编程语言,可以使用它来将图片转换为 ASCII 艺术。本文将介绍如何使用 Python 和 PIL 库来实现这一功能。

文末有完整代码

效果

先上图看效果

原图

在这里插入图片描述

ASCII 艺术图

%%%@@%#*++++++++++++++++++++++++++++++++++*#%@@%%%
%@@%*++++++++++++++++++++++++++++++++++++++++*%@@%
@%*+=+++++++++++++==++++++==+++++++++++++++++=+*%@
%*=+++++++++++++++*##%%%%%#*++====+++++++++++++=*%
*=++++++++++++++#%%%#****#%%%#*****++=++++++++++=*
++++++++++++==*%@#++====+*#%@%%%%%%%%#++++++++++++
+++++++++=++*#%@#++=++*#%%%#*++++++*#%%#++++++++++
+++++++++*%%%%@%+++*%%%#*++=++**++===+%@#+++++++++
++++++++%@%*+*@%+++%@*+==+*#%%%%%#*++=+%@*++++++++
+++++++%@#+==#@%+++%@*+*#%@%*+++*%%%%#*%@#=+++++++
+++++=#@%+++=#@%+++%@%%%##%%%#*+==+*#%@@%*=+++++++
+++++=#@%+++=#@%+=+%@#++==++#@%%#*++=+*#@%*+++++++
+++++++%@#+++*%%%#*%@*=++++=*@%*#%%%*+=+#@%+++++++
+++++++*%@#*+=++*#%%@#++==++#@%+=+%@*=+++%@*=+++++
+++++++=*@@@%#*+==+*#%%%##%%%@%+++%@*=+++%@*=+++++
++++++++#@%*#%%%%*+++*%@%#*+*@%+++%@*==+#@%+++++++
++++++++*@%+=++*#%%%%%#*+==+#@%+++%@*+*%@%++++++++
+++++++++%@%+====+**++=++*%%%%*+++%@%%%%*+++++++++
++++++++++#%%#*++++++*#%%%#*+++++#@%#*++=+++++++++
++++++++++++#%%%%%%%%@%#*+====++#@%*==++++++++++++
*+++++++++++=++*****#%%%#****#%%%#++++++++++++++++
%*=+++++++++++++====++*#%%%%%##*+=++++++++++++++++
@%*+=++++++++++++++++++=++++++=+++++++++++++++++++
%@@#*+++++++++++++++++++++++++++++++++++++++++++++
%%%@@%#*++++++++++++++++++++++++++++++++++++++++++

准备工作

在开始之前,需要确保已经安装了 Python 和 PIL 库。可以使用以下命令检查是否已经安装了 PIL 库:

import PIL
print(PIL.__version__)

如果输出了 PIL 库的版本信息,则说明已经安装成功。

加载图片

首先,需要加载一个 PNG 格式的图片,并将其转换为 RGB 格式。可以使用 PIL 库的 Image.open() 函数来加载图片,使用 convert() 方法将其转换为 RGB 格式:

from PIL import Image
# 直接将图片放再相同的目录,写名字就可以了
# 加载 PNG 图像
image = Image.open("xxx.png").convert('RGB')

调整图片大小

将图片转换为 ASCII 艺术时,需要将其调整为适当的大小。可以使用 resize() 方法来调整图片的大小:

# 调整图像大小
width, height = image.size
aspect_ratio = height / width
new_width = 50
new_height = int(new_width * aspect_ratio * 0.55)  # 调整高度以保持长宽比
image = image.resize((new_width, new_height))

定义字符集

要将图片转换为 ASCII 艺术,需要定义一个字符集,即一组字符,用于代表不同的灰度值。可以使用下面的字符集:

CHARS = [' ', '.', ':', '-', '=', '+', '*', '#', '%', '@']

将像素转换为字符

现在,可以将图片中的每个像素转换为一个字符。为了实现这一功能,可以遍历图片中的每个像素,并将其转换为一个灰度值。然后,将灰度值映射到字符集中的索引,使用相应的字符代替原始像素值。最后,将所有字符拼接在一起,以创建 ASCII 艺术。

# 将每个像素转换为字符,并拼接为字符串
ascii_art = ''
pixels = list(image.getdata())
for i in range(len(pixels)):pixel = pixels[i]gray = int((pixel[0] + pixel[1] + pixel[2]) / 3)  # 计算灰度值index = int(gray / (255 / (len(CHARS) - 1)))  # 映射到字符集中的索引ascii_art += CHARS[index]if (i + 1) % new_width == 0:ascii_art += '\\n'  # 每行结束后换行

输出 ASCII 艺术

最后,将 ASCII 艺术输出到控制台:

# 输出 ASCII 艺术
print(ascii_art)

运行代码后,将会在控制台中看到生成的 ASCII 艺术。

完整代码

下面是完整的 Python 代码,用于将图片转换为 ASCII 艺术:

from PIL import Image# 加载 PNG 图像
image = Image.open("qrcode.png").convert('RGB')# 调整图像大小
width, height = image.size
aspect_ratio = height / width
new_width = 50
new_height = int(new_width * aspect_ratio * 0.55)  # 调整高度以保持长宽比
image = image.resize((new_width, new_height))# 定义字符集
CHARS = [' ', '.', ':', '-', '=', '+', '*', '#', '%', '@']# 将每个像素转换为字符,并拼接为字符串
ascii_art = ''
pixels = list(image.getdata())
for i in range(len(pixels)):pixel = pixels[i]gray = int((pixel[0] + pixel[1] + pixel[2]) / 3)  # 计算灰度值index = int(gray / (255 / (len(CHARS) - 1)))  # 映射到字符集中的索引ascii_art += CHARS[index]if (i + 1) % new_width == 0:ascii_art += '\\n'  # 每行结束后换行# 输出 ASCII 艺术到控制台
print(ascii_art)

如果喜欢请三连,谢谢