web-dev-qa-db-ja.com

ASCIIアートテキストを簡単に印刷する方法

多くの出力をダンプするプログラムがあり、その出力のいくつかを本当に際立たせたい。 1つの方法は、重要なテキストをascii artでレンダリングすることです。たとえば、 this web service のように:

 #    #   ##   #####  #    # # #    #  ####  
 #    #  #  #  #    # ##   # # ##   # #    # 
 #    # #    # #    # # #  # # # #  # #      
 # ## # ###### #####  #  # # # #  # # #  ### 
 ##  ## #    # #   #  #   ## # #   ## #    # 
 #    # #    # #    # #    # # #    #  ####  

他のソリューションは、色付きまたは太字で出力できます。では、この種のことをPythonで簡単に行う方法は?

43
static_rtti
  • pyfiglet-pure Pythonの実装 http://www.figlet.org

    pip install pyfiglet
    
  • termcolor-ANSIカラーフォーマットのヘルパー関数

    pip install termcolor
    
  • colorama-マルチプラットフォームサポート(Windows)

    pip install colorama
    
import sys

from colorama import init
init(strip=not sys.stdout.isatty()) # strip colors if stdout is redirected
from termcolor import cprint 
from pyfiglet import figlet_format

cprint(figlet_format('missile!', font='starwars'),
       'yellow', 'on_red', attrs=['bold'])

$ python print-warning.py 

missile

 $ python print-warning.py | cat 
 .___ ___。__ _______。_______。__ __ _______ __ 
 | \/| | |/|/|| | | | | ____ || | 
 | \/| | | |(---- `|(----` | | | | | | __ | | 
 | | \/| | | |\\\\ | | | | | __ | | | 
 | | | | | | .----)| .----)| | | | `----。| | ____ | __ | 
 | __ | | __ | | __ | | _______/| _______/| __ | | _______ || _______ |(__)
81
jfs

PILは、これを非常に簡単に行うクールな方法を提供します。テキストを白黒画像にレンダリングし、そのビットマップを文字列ストリームに変換して、黒と白のピクセルを文字に置き換えることができます。

import Image, ImageFont, ImageDraw

ShowText = 'Python PIL'

font = ImageFont.truetype('arialbd.ttf', 15) #load the font
size = font.getsize(ShowText)  #calc the size of text in pixels
image = Image.new('1', size, 1)  #create a b/w image
draw = ImageDraw.Draw(image)
draw.text((0, 0), ShowText, font=font) #render the text to the bitmap
for rownum in range(size[1]): 
#scan the bitmap:
# print ' ' for black pixel and 
# print '#' for white one
    line = []
    for colnum in range(size[0]):
        if image.getpixel((colnum, rownum)): line.append(' '),
        else: line.append('#'),
    print ''.join(line)

次の結果をレンダリングします。

 #######                 ##                              #######   ##  ##
 ##   ###           ##   ##                              ##   ###  ##  ##
 ##    ##           ##   ##                              ##    ##  ##  ##
 ##    ## ##    ## ####  ######     ####    ######       ##    ##  ##  ##
 ##    ##  ##  ###  ##   ###  ##   ##  ##   ###  ##      ##    ##  ##  ##
 ##   ##   ##  ##   ##   ##   ##  ##    ##  ##   ##      ##   ##   ##  ##
 ######    ##  ##   ##   ##   ##  ##    ##  ##   ##      ######    ##  ##
 ##         ## #    ##   ##   ##  ##    ##  ##   ##      ##        ##  ##
 ##         ####    ##   ##   ##  ##    ##  ##   ##      ##        ##  ##
 ##         ####    ##   ##   ##   ##  ##   ##   ##      ##        ##  ##
 ##          ##     ###  ##   ##    ####    ##   ##      ##        ##  ########
             ##
             ##
           ###             
         ##
       ###

機能的なスタイルでもう少し包括的な例を作成しました。

import Image, ImageFont, ImageDraw

ShowText = 'Python PIL'


font = ImageFont.truetype('arialbd.ttf', 15) #load the font
size = font.getsize(ShowText)  #calc the size of text in pixels
image = Image.new('1', size, 1)  #create a b/w image
draw = ImageDraw.Draw(image)
draw.text((0, 0), ShowText, font=font) #render the text to the bitmap

def mapBitToChar(im, col, row):
    if im.getpixel((col, row)): return ' '
    else: return '#'

for r in range(size[1]):
    print ''.join([mapBitToChar(image, c, r) for c in range(size[0])])
25
jshepherd

これは楽しいです。 PIL(もちろん「ピロー」フォーク)とNumpyを使用して、これを完全に「ベクトル化」する、つまりループなしで行う方法を見つけました。

text = "Hi there"
from PIL import Image, ImageDraw, ImageFont
import numpy as np
myfont = ImageFont.truetype("verdanab.ttf", 12)
size = myfont.getsize(text)
img = Image.new("1",size,"black")
draw = ImageDraw.Draw(img)
draw.text((0, 0), text, "white", font=myfont)
pixels = np.array(img, dtype=np.uint8)
chars = np.array([' ','#'], dtype="U1")[pixels]
strings = chars.view('U' + str(chars.shape[1])).flatten()
print( "\n".join(strings))
           ##           ##                            
 ##    ##  ##      ##   ##                            
 ##    ##          ##   ##                            
 ##    ##  ##     ##### #####    ####   ## ##  ####   
 ##    ##  ##      ##   ##  ##  ##  ##  ##### ##  ##  
 ########  ##      ##   ##  ##  ##  ##  ##    ##  ##  
 ##    ##  ##      ##   ##  ##  ######  ##    ######  
 ##    ##  ##      ##   ##  ##  ##      ##    ##      
 ##    ##  ##      ##   ##  ##  ##   #  ##    ##   #  
 ##    ##  ##       ### ##  ##   ####   ##     ####   
5
Dave Rove