ASCII艺术:字符画

2015-03-03 21:24:00   技术   css django PIL python

这其实是个老话题了

我还记得我还不会写代码的年代就看到过了,当时我是真正的loli,看到复旦大学的某个BBS的图标,用各种字符写成的“复旦大学”,各种叹为观止啊,各种膜拜啊……

这次翻出来,初衷是想把评论区的头像换了,gravatar被墙得非常凄惨,虽然有各种storage的方法之类的,但是我还是觉得不爽……也许原因是在这里留言的好像只有我自己……

参考文章

通过python将图片生成字符画

其实理论很简单

就是把图片灰度了之后从黑色到白色用密度不同的字符来代替,感觉有点隔着裤子放屁

原图

原图

效果图

效果图

做成文字的版本其实比图片更加隔着裤子放屁,逻辑是先画一张白底图,然后在上面写文字,然后再做成上面这一步…………

效果可以是这样

       ::                          ##########                           ::::##     #     #                #        #    #                               #              :            #                               :              #      #:           #        
 ##### :# #####    ##########      #        #    ##############   :########:::    :#    :#        #####   #      #:#   ::                              :#              ##           #  :: #####  #############:    :# ########     #      :#           #:       
   #    :   #              :#      #        #               #       :   :   ##   #####  ##                #      # #   #######                         :#        #############    ######  #  :#       #  #         #: #      #     #      :#     #############  
   # #####  #        #     ##      ##########               #       ## :#: :#:   #   # :######          #######  ####:## # # #                         :#        #           #      # #:  #  #:   ############    :#  #      #   #####: #######  #           #  
   #     #  #       :#     #:      #        #               #     #############  #   # #:    #            #   #  # # :# :# # #                    #############  #:###########      ###   #  #    #   #  #   #    ##  ########     #    #     #  #  :        #  
   #  #: #  #       :#     #:      ##########      #####    #     #   :       #  #   #:#     #   ######   #   # :# # :: #::# #                         :#:           :##         ######## # ::    #   #  #   #   :##     #         #    #     #    :#           
 ####::#:#  #       :#     #:                      #   #    #     :  :#       :  #   #   :   #     #:     #   #  : #    # :: #                         ###        :###:##   #     :#:     # #:    ############   # #     #         # :: #     #    :#     :#    
   #   ########     ###########  ##############    #   #    #     #############  #####   #   #     #     :#   #    #:: #: #  #                         #:#        #:  :##::#:    #######  #  #:       ::           # ##########   :###: #######    :#  :###:    
   #    #:  #                :#     :  #           #   #    #       :#           #   #   ##  #    :# :#  ::   #   :## :# :#  #                        :# ##         :## ####     :#    #  #  :#  ##############    #    ###:     ###    #          :####:       
   #    #:  #                :#    :#  #           #####    #       ##########   #   #    #  #    #:  #  #:   #  ### :#  #:  #                        #:  #:     :###: :## #      #    #  #   #     :#:   ##       #   :####       #    #          :#           
   #:# :##  #     #########: :#    #:  ######:     #        #      #:##     #:   #   #       #   :#   #: #   :#  : #    ##  :#                       ##   :#     ::  :##:# :#     ######  #   #    :#:   :#        #   # # ##      #   :#          :#        :  
 :###  ###  #                :#   :##: #                    #    :#:  ##: ##:    #   #       #   #####:#:#   :#    #   :#   :#     ##              :##     ##      :##: :#  ##    #    #  # ##:    ::#####         # :#: #  ##:    #   #:          :#       :#  
 #:   ##    #                #:  :#: ###:                   #     :   :####:     #####      ::   ::     #    #:    #  :#    #:     ##             ##:       ##:  ###:   ##   #    ######  #        ::###:###:      # #:  #   :#    #  :#           :#:::::::#:  
     ##   #####:          :###   #:    :#######          ####      ####:  :####  #       :###          #:  ###     #     :###      :#            ##:         :#:     ####         #    #  #      ####:     :##     #     #       ###  :#            ########:   
                                                                                                                   :               #                                                                                                                            

碰到了很多坑

比如说chrome的最小字体是12pt,文字版的就觉累不爱了,图片版就transform: scale(0.1); transform-origin: 0% 0%;,然后用个div框起来隐藏大得离谱的长宽

firefox的换行间隔和chrome不一样大,这个问题直接无视了

ubuntuPC/手机/WindowsPC等宽字体不一样,最后用Courier字体搞定了

参考:Web页面的字体有哪些

新浪云python居然没有字体的const,最后我只能自己上传文泉驿,原来我还想上传思源字体的,毕竟开源字体,看看那空间就100M就算了……

在线页面

想自己玩的可以去下面这2个地方玩

文字转换

图片转换

相关源代码

# -*- coding: utf-8 -*-
from PIL import Image, ImageFont, ImageDraw
    

def write_txt(txt, font_family=Font_WQY_ZenHei, font_size=17, color='##  '):
    txt = unicode(txt)
    font = ImageFont.truetype(font_family, size=font_size, encoding="utf-8")
    img = Image.new(
        'RGB', (font.getsize(txt)[0], font.getsize(txt)[1]), "white")
    ImageDraw.Draw(img).text((0, 0), txt, (0, 0, 0), font)
    return write_img(img, color=color)


def write_img(img, color='MNHQ$OC?7>!:-;. '):
    width, height = img.size
    pix = img.convert('L').load()
    pic_str = ''
    for h in xrange(height):
        for w in xrange(width):
            pic_str += color[int(pix[w, h]) * (len(color) - 1) / 255]
        pic_str += '\n'
    return pic_str
评论已关闭。
评论共