效果图
放大看的细节
原理解析
从放大图中可以看出照片的每个像素都是一个个字符组成的,原理其实很简单,只需要将原先的彩色图变成灰度模式,然后,再根据图像中每个像素的灰度值(灰度深浅)找到不同复杂度的 ASCII 字符一一映射。
一个像素就是一个字符……
我们知道,有些字符比较复杂(像 @ # %),远远地看上去就比较 “黑”;有些字符比较简单(像 . - +),看起来也就比较 “白”。
所以,灰度越大的像素,就应该使用看起来越 “黑” 的字符,反之亦然。
代码
1.选择python的PIL库,但是由于更新慢,我们可以选择它的分支pillow,换句话说就是在cmd里
pip install Pillow
2.由于 Pillow 是 PIL 的一个分支版本,所以导入 Pillow 的操作是这样的:
import PIL
#或者
from PIL import Image
3.将彩色的图片转换成灰度模式,可以使用 PIL.Image 模块的 convert("L") 方法:
from PIL import Image
img = Image.open('2.jpg')
out = img.convert('L')
out.show()
3.接下来就要计算图片的宽度和高度,可以把 Image 对象的 size 属性取出来就可以了:
width,height = out.size
print(width,height)
842 922
4.通常照片尺寸越大,所生成的字符细节越多,作为一个演示版本,我们将尺寸拦腰砍一半
width,height = out.size
out = out.resize((int(width*0.5),int(height*0.5)))
width,height = out.size
print(width,height)
421 461
5.灰度模式的图像它每个像素有一个灰度值,这个值的范围是 0 ~ 255,它的值越小说明它越黑(0 是纯黑色,255 是纯白色)。使用 Image 对象的 getpixel 方法可以获取指定位置的像素值:
print(out.getpixel((100,100)))
217
补充一下,如果对图像里像素坐标很懵了话,可以看这张图
6.好那既然能够获取图片中每个像素的灰度值,那么我们就可以根据它来决定使用不同复杂度的 ASCII 字符,@%#*+=-:.依次表示灰度值由深到浅的几个字符
asciis = '@%#*+=-:. '
texts = ''
for row in range(height):
for rol in range(width):
gray = out.getpixel((rol,row))
texts += asciis[int(gray/255*9)]
texts += '\n'
7.最后大结局,将文件保存以后用notepad++这样的超级文本器打开滑动缩放就可以看到效果图啦
with open('xg.txt',‘w') as f:
f.write(texts)