用PIL库将图片转换成字符画

用PIL库将图片转换成字符画

图片是由不同颜色的像素点构成的,我们可以用不同的字符代表不同的颜色,这样就用字符串形成了样式上相似的图画。以前百度贴吧还很火的时候经常有人用一大堆字符占楼,粗略的看上去就能看出这一堆字符似乎组成了一个图象,比如:有这样一张图

windows XP 微标

把它转换成字符画大概可以是:

字符画

只要字体是等宽的,最后的显示结果都可以把原图像中的形状轮廓和颜色明暗表示出来,就如windows徽标上高光的部分在字符画上也显示的比较白,颜色深的地方也是用比较密集的字符堆起来的。

下面我们用python语言中的PIL库来实现这个过程。

PIL库是python语言的第三方库,原版的PIL库只支持到python 2.7,后来许多爱好者一起开发了支持python 3+的版本,安装库的名字是pillow。它支持图像存储、显示和处理,它能处理几乎所有的图片格式,可以完成对图像的缩放、叠加、裁剪以及颜色图形的添加或修改。最重要的是,它可以使用python程序语言来控制,易于批量操作。

使用时,引入PIL库的Image,打开一个图片文件,在Image中有一个图像的getpiexel()方法,可以获得图像在某一像素点处的RGB值,我们可以定义一个函数,将获得的RGB值转化为灰度值。根据灰度值的大小设定不同的位置处输出的字符,例如像灰度值高的点可以显示#¥&WM@等看起来比较满的字符,而灰度值低的地方可以显示成~-:;.`’这种占位比较小的字符。这样对全图伸缩到适于程序控制和图案显示的大小,遍历整个图像就可以得到字符画了。


from PIL import Image
graychar=list("#&$@WMZwm=Va+u6pqds3*(?tiO{[!/<>o;:)'.—-")
#灰度值映射到字符的一种表示,可自定义

def outputchar(r,b,g,alpha=256):
	if alpha==0:
		return ''
	gray= int(0.2126*r+0.7152*g+0.0722*b)
	unit=256/len(graychar)
	return graychar[(int(gray//unit))]

前边介绍过,Image当中图形有getpixel()方法可以获得一个RGB值,返回值是一个元组,所以在主函数中可以用ouputchar(*pic.getpixel((x,y))调用来获得对应位置的字符,其中(x,y)是图像的坐标点。getpixel()方法接收一个元组作为坐标,所以调用时这里有两层括号。

pic=Image.open("hello.jpg")
WIDTH,HEIGHT=80,45
pic=pic.resize((WIDTH,HEIGHT))
#resize方法调整读取图片的宽度与高度
txt=""
#用来保存字符画的字符串
for y in range(HEIGHT):
	for x in range(WIDTH):
		txt+=output(*pic.getpixel((x,y)))
	txt+='\n'
	print(txt)

注意,输出平台一定要将字体设定为等宽类型的,不然显示不出效果。

发表评论

电子邮件地址不会被公开。 必填项已用*标注