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)
如果喜欢请三连,谢谢