更新!項(xiàng)目最新地址鏈接:click me
我們先來(lái)看一下效果??(圖為知乎的吉祥物:劉看山)

原畫(huà)

字符畫(huà)(由于圖片較大,所以截圖的時(shí)候未截完整:P)
代碼在此,簡(jiǎn)單講解請(qǐng)看代碼的注釋部分,部分詳解在代碼之后:
#! /usr/bin/env python
# coding: utf-8
from PIL import Image
import argparse
# 命令行參數(shù)工具
# 此處不是重點(diǎn),故而不做講解,具體參見(jiàn) (https://docs.python.org/2/library/argparse.html)
parser = argparse.ArgumentParser()
parser.add_argument('file')
args = parser.parse_args()
imgpath = args.file
# 變量ascii_char: 存儲(chǔ)用于顯示圖片的字符種類(lèi)。我們要注意到,這個(gè)list的最后一個(gè)元素是空格,這表示,我們
# 將使用空格來(lái)代替原圖片中灰度值最高的像素點(diǎn)(在灰度圖像中,灰度值最高為255,代表白色,最低為0,代表黑色)。
# list中的第一個(gè)元素是$,這表示我們將使用$來(lái)代替原圖片中灰度值最低的像素點(diǎn)。其余字符依此類(lèi)推。
ascii_char = list(r"$@&%B#=-. ")
# 把RGB轉(zhuǎn)為灰度值,并且返回該灰度值對(duì)應(yīng)的字符標(biāo)記
def select_ascii_char(r, g, b):
gray = int((19595 * r + 38469 * g + 7472 * b) >> 16) # ‘RGB-灰度值’轉(zhuǎn)換公式
unit = 256.0/len(ascii_char) # ascii_char中的一個(gè)字符所能表示的灰度值區(qū)間
return ascii_char[int(gray/unit)]
# 返回給定路徑圖片的字符表示,用戶在此還可以指定輸出字符畫(huà)的寬度和高度
def output(imgpath, width=100, height=100):
im = Image.open(imgpath)
im = im.resize((width, height), Image.NEAREST)
txt = ""
for h in xrange(height):
for w in xrange(width):
txt += select_ascii_char(*im.getpixel((w, h))[:3]) # 此處請(qǐng)看詳解(1)
txt += '\n'
return txt
def save_as_txtfile(txt):
with open('imgtochar.txt', 'wb') as f:
f.write(txt)
if __name__ == '__main__':
print output(imgpath, 120, 90)
save_as_txtfile(output(imgpath, 120, 90))
詳解部分:
(1)
getpixel()函數(shù)接受一個(gè)元組作為輸入?yún)?shù),該元組為一個(gè)二維坐標(biāo),函數(shù)將返回該坐標(biāo)處像素點(diǎn)的RGB三個(gè)值。
(有時(shí)候還會(huì)返回RGBA四個(gè)值,這取決于圖片的彩色模型。也正是因此,我們此處采取切片的方式,即[:3],來(lái)保證select_ascii_char函數(shù)恰好只接收到3個(gè)參數(shù))
我們還要注意到,此處的im.getpixel((w, h))[:3]前面有一個(gè)星號(hào),即*,這里涉及的語(yǔ)法點(diǎn)是“可變參數(shù)”,詳情參見(jiàn)
廖雪峰博客:可變參數(shù)