多くの出力をダンプするプログラムがあり、その出力のいくつかを本当に際立たせたい。 1つの方法は、重要なテキストをascii artでレンダリングすることです。たとえば、 this web service のように:
# # ## ##### # # # # # ####
# # # # # # ## # # ## # # #
# # # # # # # # # # # # # #
# ## # ###### ##### # # # # # # # # ###
## ## # # # # # ## # # ## # #
# # # # # # # # # # # ####
他のソリューションは、色付きまたは太字で出力できます。では、この種のことをPythonで簡単に行う方法は?
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
$ python print-warning.py | cat .___ ___。__ _______。_______。__ __ _______ __ | \/| | |/|/|| | | | | ____ || | | \/| | | |(---- `|(----` | | | | | | __ | | | | \/| | | |\\\\ | | | | | __ | | | | | | | | | .----)| .----)| | | | `----。| | ____ | __ | | __ | | __ | | __ | | _______/| _______/| __ | | _______ || _______ |(__)
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])])
これは楽しいです。 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))
## ##
## ## ## ## ##
## ## ## ##
## ## ## ##### ##### #### ## ## ####
## ## ## ## ## ## ## ## ##### ## ##
######## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ###### ## ######
## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## # ## ## #
## ## ## ### ## ## #### ## ####