【Python 圖片轉(zhuǎn)字符畫】

kanshan.png

1.原理

字符畫是一系列字符的組合蒂阱,我們可以把字符看作是比較大塊的像素锥咸,一個(gè)字符能表現(xiàn)一種顏色(為了簡(jiǎn)化可以這么理解)扁位,字符的種類越多,可以表現(xiàn)的顏色也越多者铜,圖片也會(huì)更有層次感腔丧。

問(wèn)題來(lái)了放椰,我們是要轉(zhuǎn)換一張彩色的圖片,這么多的顏色愉粤,要怎么對(duì)應(yīng)到單色的字符畫上去砾医?這里就要介紹灰度值的概念了。

灰度值:指黑白圖像中點(diǎn)的顏色深度衣厘,范圍一般從0到255如蚜,白色為255,黑色為0影暴,故黑白圖片也稱灰度圖像错邦。

另外一個(gè)概念是RGB 色彩:

RGB色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn),是通過(guò)對(duì)紅(R)型宙、綠(G)撬呢、藍(lán)(B)三個(gè)顏色通道的變化以及它們相互之間的疊加來(lái)得到各式各樣的顏色的,RGB即是代表紅妆兑、綠魂拦、藍(lán)三個(gè)通道的顏色,這個(gè)標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色搁嗓,是目前運(yùn)用最廣的顏色系統(tǒng)之一芯勘。- 來(lái)自百度百科介紹

我們可以使用灰度值公式將像素的 RGB 值映射到灰度值(注意這個(gè)公式并不是一個(gè)真實(shí)的算法,而是簡(jiǎn)化的 sRGB IEC61966-2.1 公式腺逛,真實(shí)的公式更復(fù)雜一些荷愕,不過(guò)在我們的這個(gè)應(yīng)用場(chǎng)景下并沒(méi)有必要):

gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

這樣就好辦了,我們可以創(chuàng)建一個(gè)不重復(fù)的字符列表棍矛,灰度值邪擦啤(暗)的用列表開(kāi)頭的符號(hào),灰度值大(亮)的用列表末尾的符號(hào)茄靠。


2.上代碼

# -*- coding=utf-8 -*-

from PIL import Image 
import argparse

#命令行輸入?yún)?shù)處理
parser = argparse.ArgumentParser()

parser.add_argument('picture_name')     #輸入文件
parser.add_argument('-o', '--output')   #輸出文件
parser.add_argument('--width', type = int, default = 80) #輸出字符畫寬
parser.add_argument('--height', type = int, default = 80) #輸出字符畫高

#獲取參數(shù)
args = parser.parse_args()

IMG = args.picture_name
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")

# 將256灰度映射到70個(gè)字符上
def get_char(r,g,b,alpha = 256):
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

    unit = (256.0 + 1)/length
    return ascii_char[int(gray/unit)]

if __name__ == '__main__':

    im = Image.open(IMG)
    im = im.convert('RGB')
    im = im.resize((WIDTH,HEIGHT), Image.LANCZOS)
#使用resize()方法重新設(shè)置圖片大小茂契,其中第一個(gè)參數(shù)應(yīng)是一個(gè)尺寸元組
#而第二個(gè)參數(shù)resample有四個(gè)選項(xiàng),分別是Image.NEAREST慨绳、Image.BILINEAR掉冶、
#Image.BICUBIC、Image.LANCZOS脐雪,默認(rèn)是第一個(gè)厌小,第四個(gè)質(zhì)量最高
    txt = ""

    for i in range(HEIGHT):
        for j in range(WIDTH):
            txt += get_char(*im.getpixel((j,i)))
        txt += '\n'
    print(txt)
    #字符畫輸出到文件
    if OUTPUT:
        with open(OUTPUT,'w') as f:
            f.write(txt)
    else:
        with open("output.txt",'w') as f:
            f.write(txt)

3.上效果

#涉及的相關(guān)知識(shí)點(diǎn),后續(xù)補(bǔ)上战秋。
執(zhí)行命令 #python ascii.py kanshan.png --width 50 --heigh 30

kanshans.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末璧亚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脂信,更是在濱河造成了極大的恐慌癣蟋,老刑警劉巖透硝,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疯搅,居然都是意外死亡濒生,警方通過(guò)查閱死者的電腦和手機(jī)柑潦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門润绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜕衡,你說(shuō)我怎么就攤上這事礁蔗【跻澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵浴井,是天一觀的道長(zhǎng)晒骇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)滋饲,這世上最難降的妖魔是什么厉碟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任喊巍,我火速辦了婚禮屠缭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崭参。我一直安慰自己呵曹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布何暮。 她就那樣靜靜地躺著奄喂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪海洼。 梳的紋絲不亂的頭發(fā)上跨新,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音坏逢,去河邊找鬼域帐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛是整,可吹牛的內(nèi)容都是我干的肖揣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浮入,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼龙优!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起事秀,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤彤断,失蹤者是張志新(化名)和其女友劉穎野舶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宰衙,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筒愚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菩浙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巢掺。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劲蜻,靈堂內(nèi)的尸體忽然破棺而出陆淀,到底是詐尸還是另有隱情,我是刑警寧澤先嬉,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布轧苫,位于F島的核電站,受9級(jí)特大地震影響疫蔓,放射性物質(zhì)發(fā)生泄漏含懊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一衅胀、第九天 我趴在偏房一處隱蔽的房頂上張望岔乔。 院中可真熱鬧,春花似錦滚躯、人聲如沸雏门。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茁影。三九已至,卻和暖如春丧凤,著一層夾襖步出監(jiān)牢的瞬間募闲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工愿待, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浩螺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓呼盆,卻偏偏與公主長(zhǎng)得像年扩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子访圃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 字符畫真的很有意思厨幻,將圖片中的像素用字符代替,就生成了字符畫。 但是像素是有顏色深淺的况脆,我們?nèi)绾螌в胁煌伾南?..
    大鄧和他的python閱讀 1,700評(píng)論 1 4
  • 簡(jiǎn)介 字符畫是一系列字符的組合饭宾,可以把字符理解為像素,字符越多格了,代表的顏色越復(fù)雜看铆,圖片也更有層次感。 正文 那么彩...
    極客匠閱讀 352評(píng)論 0 0
  • 雖然我PHP教程還沒(méi)寫完呢盛末,我昨天試圖寫來(lái)著弹惦,后來(lái)又沒(méi)寫。:cry: 我女朋友不知道為啥又生氣了悄但,昨天早上還好著呢...
    郭貳小姐閱讀 646評(píng)論 0 0
  • 2019.4.2 雖然自己十分喜歡Python棠隐,但一直都只是處于入門的狀態(tài)而已,平時(shí)沒(méi)有通過(guò)一些小項(xiàng)目來(lái)增強(qiáng)自己的...
    zackary_shen閱讀 804評(píng)論 0 1
  • 首先導(dǎo)入必要的庫(kù)檐嚣,argparse 庫(kù)是用來(lái)管理命令行參數(shù)輸入的 首先導(dǎo)入必要的庫(kù)助泽,argparse 庫(kù)是用來(lái)管理...
    涼初透的風(fēng)閱讀 683評(píng)論 0 1