摘要这一篇文章介绍使用Python生成字符画的方式. 会给出简单的原理介绍和实现的方式. 最后会给出源代码的链接地址.

简介

这一篇介绍一下使用Python来进行字符画的生成. 这里会介绍一下生成的步骤和生成的代码. 同时会将代码的Github的链接附在最后. 最终的生成的效果会是下面的这个样子.

生成的方式和原理

这一部分介绍一下生成字符画的原理和代码实现. 同时会给出代码仓库的链接.

源代码

Github仓库链接: Python生成字符画

觉得在这里看起来不方便可以在代码仓库中进行查看.

实现原理

其实实现的想法很简单, 我们希望将每一个像素点都对应到一个字符串上面. 于是对于每一张图片来说, 我们依次遍历他的像素点, 比如灰度图像是256种灰度, 我们对应到256个字符串上面. 这样就可以实现图像转字符串. 下面是一个流程.

读入图片, 修改图片大小

对每一个像素点进行操作

若是彩色, 则转换为灰度

将灰度值映射为字符串

在转换为字符串的时候, 因为像素块是正方形的, 字符串是长方形的, 即一般的字母都是长比宽大, 所以我们在实际处理的时候, 会在每个字符后面加上一个空格, 来缓解一下最终输出时候长和宽不对等的情况. 这个也就是对应代码中的, txt += '  '.

将最终的结果进行保存

代码实现

我们将上面介绍的方法进行代码实现. 我将所有的注释都写在代码中了, 可以直接进行阅读.

from PIL import Image
import fire
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 将256灰度映射到70个字符上-即输入一个像素点,输出一个符号
def get_char(r,g,b,alpha = 256):
if alpha == 0:
return ' '
length = len(ascii_char)
# 将彩色转换为灰度
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = (256.0 + 1)/length
return ascii_char[int(gray/unit)]
def image_process(input_file, output_file='res.txt', pic_height=100, pic_weight=100):
# 加载图片
im = Image.open(input_file)
# 调整图片大小
im = im.resize((pic_weight,pic_height), Image.NEAREST)
# 保存缩小后的图片
# im.save('temp.jpg')
txt = ""
# 对每个像素点进行操作
for i in range(pic_height):
for j in range(pic_weight):
txt += get_char(*im.getpixel((j,i)))
txt += '  '
txt += '\n'
print(txt)
#字符画输出到文件
if output_file:
with open(output_file,'w') as f:
f.write(txt)
else:
with open("output.txt",'w') as f:
f.write(txt)
if __name__ == '__main__':
"""
input_file: 图像的名称
output_file: 保存文件的名称
"""
fire.Fire(image_process)

最终在使用的时候, 可以直接在命令行中进行操作.

python char_pic.py ../char_pic/62.jpg

我们再看一个例子的效果, 关于效果的查看, 可以使用文本编辑器进行缩放, 使用Ctrl+-进行缩放.

python生成一个字符串 python生成字符画_字符串

一些其他的

今天打开bing的时候没打开, 第一次看到这样的错误提示, 很是可爱.

python生成一个字符串 python生成字符画_python生成一个字符串_02