美文网首页
字符画下的魔鬼

字符画下的魔鬼

作者: 超人不会飞_9664 | 来源:发表于2018-11-28 19:19 被阅读0次

    效果图

    捕获.PNG

    放大看的细节

    捕获2.PNG

    原理解析

    从放大图中可以看出照片的每个像素都是一个个字符组成的,原理其实很简单,只需要将原先的彩色图变成灰度模式,然后,再根据图像中每个像素的灰度值(灰度深浅)找到不同复杂度的 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()
    
    捕获4.PNG

    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
    

    补充一下,如果对图像里像素坐标很懵了话,可以看这张图


    捕获7.PNG

    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)
    

    好玩好玩

    相关文章

      网友评论

          本文标题:字符画下的魔鬼

          本文链接:https://www.haomeiwen.com/subject/sapzqqtx.html