我们在使用linux的软件的时候经常会看到这样的字符画。
你千万别认为是像C语言那样一个个字符打上去的_!今天我将通过python实现一个图片转化为字符画的小工具。
首先我们需要定义一些字符,我们这里定义了这些字符
ASSIIC_CHAR = list("123q$e@x")
我们希望我们输出的字符是有颜色的,这里我们用到了colorama
里面的Fore
,也就是前景色。具体用法如下
COLORS = [Fore.BLACK, Fore.RED, Fore.GREEN, Fore.YELLOW, Fore.BLUE, Fore.MAGENTA, Fore.CYAN, Fore.WHITE]
COLORS_RGB = [(0,0,0), (255,0,0), (0, 255,0), (255,255,0), (0,0,255), (255,0,255), (0,255,255), (255,255,255)]
print(COLORS[i]+"string")
因为这里只有8种颜色,所以我们的字符数量也是8个。
接着我们定义计算颜色距离的函数,也就是描述两种颜色之间的相似程度
def i2(r, g, b):
color_len = []
for i in COLORS_RGB:
temp = (i[0] - r)**2 + (i[1] - g)**2 + (i[2] - b)**2
color_len.append(temp)
return color_len.index(min(color_len))
接着我们定义获取字符的函数
def get_char(r, g, b, a=256):
i = i2(r, g, b)
return ASSIIC_CHAR[i], i
通过这个函数,我们获得各颜色对应的字符以及各自的位置。
最后在主函数中打开一幅图片,并且对图片大小重新定义,读取重定义后的每个图片的像素,测算像素对应的颜色。
if __name__ == '__main__':
pic = Image.open(IMG)
pic = pic.resize((WIDTH, HEIGHT), Image.NEAREST)
pic.show()
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
ch, w = get_char(*pic.getpixel((j, i)))
print(COLORS[w]+ch*3, end='')
txt += ch
print('\n')
txt += '\n'
最后的效果图
项目地址,give me a star O(∩_∩)O!