视频讲解链接:https://www.bilibili.com/video/BV1JC4y1d7vb/
- 网站
- 原理
- 图像艺术画-代码讲解
- 文字艺术画-代码讲解
字符画的原理
字符画(ASCII art)是一种通过使用文本字符来创建图像的艺术形式。字符画的原理基于以下概念:
- 字符集合:字符画使用一个有限的字符集合来表示不同的灰度值或颜色。这些字符可以是标准的ASCII字符,也可以是扩展字符集合,具体取决于艺术家的选择。通常使用的字符包括字母、数字、符号以及空格。
- 灰度值映射:每个字符都对应一个灰度值或颜色值。通常,字符集合中的字符按照它们的密度和暗度进行排列,使得在字符画中可以更精确地表示图像的不同部分。
- 图像转换:要创建字符画,首先需要将目标图像转换为灰度图像,其中每个像素点都表示灰度值,通常在0(黑色)到255(白色)之间。这些灰度值将用于选择适当的字符来代表图像的不同部分。
- 字符替代:将图像的每个像素映射到字符集合中的一个字符,选择的字符通常是与对应像素的灰度值相匹配的字符。较亮的像素将映射到较轻或稀疏的字符,而较暗的像素将映射到较密集或较深的字符。
- 分辨率控制:字符画的质量和精细度取决于字符集的大小和输出设备的分辨率。较大的字符集和更高的分辨率可以生成更详细和精细的字符画,但也会增加字符的数量。
总之,字符画的原理是将图像的每个像素映射到一个字符,通过选择适当的字符来表示不同的灰度值或颜色,从而在文本界面上创建出图像。字符画是一种有趣的艺术形式,常常用于表达创意、传达信息或简化图像以适应特定的显示条件。它们也可以通过计算机程序自动生成,将图像转换为字符画的过程称为字符画生成。
字符的排列顺序的讲究
ASCII字符集中的字符排列顺序通常是按照字符的密度或灰度级别从高到低排列的,这样可以在生成字符画时更好地反映图像的亮度或密度变化。具体来说:
"@"
通常被视为最暗的字符,因此通常用于表示图像中的最黑暗部分。" "(空格)
通常被视为最亮的字符,用于表示图像中的最亮部分。- 中间的字符
"%#*+=-:."
根据其在ASCII字符集中的灰度级别递增,用于表示图像中的中间亮度级别。
这个字符排列顺序的选择是为了尽可能准确地模拟图像中的灰度级别,使字符画看起来更接近原始图像。
然而,这只是一种常见的字符排列顺序,并没有固定的规则。在生成字符画时,您可以根据自己的喜好和需求选择不同的字符集和排列顺序。根据所选字符集和排列顺序,字符画的外观和效果可能会有所不同。因此,您可以根据自己的审美标准和具体情况进行调整和实验。
图像转艺术字
# -*- coding: utf-8 -*-
# @Time : 2023/10/10 11:25
# @QQ : 2942581284
# @File : 字符画.py
from PIL import Image
# 字符集,您可以根据需要进行修改
ASCII_CHARS = "@%#*+=-:. "
# 将灰度值映射到字符
def scale_gray(value):
scale = (len(ASCII_CHARS) - 1) / 255
return ASCII_CHARS[int(value * scale)]
# 将图像转换为字符画
def image_to_ascii(image_path, output_width=100):
image = Image.open(image_path)
width, height = image.size
aspect_ratio = height / width
new_height = int(output_width * aspect_ratio)
resized_image = image.resize((output_width, new_height))
grayscale_image = resized_image.convert('L') # 转换为灰度图像
# 将灰度图像转换为NumPy数组
# import numpy as np
# grayscale_matrix = np.array(grayscale_image)
# 打印灰度矩阵
# print(grayscale_matrix)
ascii_art = ""
for y in range(new_height):
for x in range(output_width):
pixel_value = grayscale_image.getpixel((x, y))
ascii_art += scale_gray(pixel_value)
ascii_art += "\n"
return ascii_art
if __name__ == "__main__":
input_image_path = "kun.jpg" # 替换为您自己的图像文件路径
# input_image_path = "pattern_with_padding.png" # 替换为您自己的图像文件路径
output_width = 200 # 输出字符画的宽度
ascii_art = image_to_ascii(input_image_path, output_width)
print(ascii_art)
with open(input_image_path+'.txt','w',encoding='utf-8') as f:
f.write(ascii_art)
文字转图像
from PIL import Image, ImageDraw, ImageFont
import numpy as np
hanzi = "编程启航"
font_size = 48
# 使用系统字体或指定字体文件
font = ImageFont.truetype("1.ttf", font_size)
# 计算汉字的大小
text_bbox = font.getbbox(hanzi)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]
# 设置填充大小
padding = 20
# 创建一个空白图像,大小根据文本计算,并添加填充
pattern_size = (text_width + 2 * padding, text_height + 2 * padding)
pattern_image = Image.new('RGB', pattern_size, color=(255, 255, 255))
pattern_draw = ImageDraw.Draw(pattern_image)
# 在花纹背景上绘制汉字,考虑填充
pattern_draw.text((-text_bbox[0] + padding, -text_bbox[1] + padding), hanzi, fill=(0, 0, 0), font=font)
# 将花纹图像转换为NumPy数组以便处理
pattern_data = np.array(pattern_image)
# 在这里,您可以对花纹进行任何自定义的图像处理操作,例如添加滤镜或效果
# pass
# 创建Pillow图像对象并显示
pattern_image = Image.fromarray(pattern_data)
pattern_image.show()
# 保存花纹图像
pattern_image.save("pattern_with_padding.png")
更多宝藏
🍇🍉🍊🍏🍋🍅🥝🥥🫒🫕🥗
视频推送看这里🤤:
[https://space.bilibili.com/1909782963](https://space.bilibili.com/1909782963](https://space.bilibili.com/1909782963))
项目仓库看这里🤗:
[https://github.com/w-x-x-w](https://github.com/w-x-x-w](https://github.com/w-x-x-w))
[https://gitee.com/w-_-x](https://gitee.com/w--x](https://gitee.com/w--x))
公众号名称😮:编程启航
博客文章看这里🤭:
[https://blog.csdn.net/weixin_62650212](https://blog.csdn.net/weixin_62650212](https://blog.csdn.net/weixin_62650212))