用Python把圖片變成字符畫(huà)

更新!項(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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容