字符画就是一系列字符的组成,我们可以将一个个字符看做为一个个像素(当然字符与像素之间的对应关系就不一定是单纯的一对一关系了,可以是多对一,也可以是一对多的关系,这个就需要看字符的数量了)字符的种类越多,图片的层次感越强,也就越接近真实图片。
因为最终显示的黑白图片,所以首先要考虑的是将彩色图片转换为灰度值图像(灰度值是指黑白图像中点的颜色深度,范围一般在0-255之间,白色为255,黑色为0,黑白图片也成灰度图像。)在这里可以直接使用公式即可0.2126*r+0.7152*g+0.0722*b,然后再将灰度值与字符对应起来。
def getchar(r,g,b):
#定义映射字符
#list函数可以将字符串转换成列表
txt=list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.")
#获取灰度值,映射字符
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b # 把rgb图像化为灰度图
#比例
bili=256/len(txt)
index=int (gray/bili)
return txt[index]
image=Image.open("wy1.jpg")
#设置宽高
width=200
height=150
#定义大小
image=image.resize((width,height),Image.NEAREST)
for y in range(height):
for x in range(width):
#获取彩色图片的像素getpixel(x,y),并赋值给pix,此时pix是一个元组
pix=image.getpixel((x,y))
#将pix元组中的像素值获取出来,变成r,g,b的三个数值,然后传给getchar函数,转换出相应的字符
txt+=getchar(*pix)
txt+="\n"
# 思路:获取图片,获取图片的每一个像素,每个像素都是由rgb组成的,我们可以将彩色的图片转化为灰度图(得到灰度值)
# 再将相应的灰度值对比到相应的字符数据中,将每个字符按照顺序进行存储
import Image
def getchar(r,g,b):
#定义映射字符
#list函数可以将字符串转换成列表
txt=list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.")
#获取灰度值,映射字符
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b # 把rgb图像化为灰度图
#比例
bili=256/len(txt)
index=int (gray/bili)
return txt[index]
image=Image.open("wy1.jpg")
#设置宽高
width=200
height=150
#定义大小
image=image.resize((width,height),Image.NEAREST)
#定义存储数据的变量
txt=""
#进行像素的遍历和提取
#
for y in range(height):
for x in range(width):
#获取彩色图片的像素getpixel(x,y),并赋值给pix,此时pix是一个元组
pix=image.getpixel((x,y))
#将pix元组中的像素值获取出来,变成r,g,b的三个数值,然后传给getchar函数,转换出相应的字符
txt+=getchar(*pix)
txt+="\n"
with open("wy1.txt","w",encoding="utf-8")as file:
file.write(txt)
file.close()
原图片:
字符画: