Python實(shí)現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫
前言
要將圖片轉(zhuǎn)換為字符圖其實(shí)很簡(jiǎn)單,我們首先將圖片轉(zhuǎn)換為灰度圖像,這樣圖片的每個(gè)像素點(diǎn)的顏色值都是0到255,然后我們選用一些在文字矩形框內(nèi)占用面積從大到小的ASCII碼字符,我經(jīng)過(guò)一番觀察選擇了如下字符:
ascii_chars = "MNHQ$OC67+>!:-. "
很明顯M的筆畫比N多,縮小到足夠小之后就會(huì)體現(xiàn)出M的顏色比N更深,大家若能夠找到更能夠體現(xiàn)這種特征的字符,也可以替換。
然后我們只需要將圖片的目標(biāo)像素點(diǎn)映射到這批字符上,代碼大概就是:
ascii_chars[color*(len(ascii_chars)-1)//255]
字符畫圖片生成
先準(zhǔn)備好測(cè)試圖片:
from PIL import Image img = Image.open('test.jpg') img
然后我們將圖片轉(zhuǎn)換為灰度圖片并縮放到指定大?。?/strong>
new_w = 100 w, h = img.size img = img.convert("L").resize((new_w, int(new_w*h//w))) w, h = img.size data = img.load() img
然后開(kāi)始繪制字符圖片:
from PIL import ImageFont, ImageDraw f_size = 3 img_new = Image.new('L', (w * f_size, h * f_size), 255) f = ImageFont.truetype('arial.ttf', f_size) d = ImageDraw.Draw(img_new) n = len(ascii_chars)-1 for y in range(h): for x in range(w): char = ascii_chars[data[x, y]*n//255] d.text((x * f_size, y * f_size), char, fill=0, font=f) img_new
個(gè)人感覺(jué)效果還是不錯(cuò)的,我們可以把上述邏輯封裝成一個(gè)方法:
from PIL import Image, ImageFont, ImageDraw def img2charImg(filename, new_wight, font_size): "小小明:https://blog.csdn.net/as604049322" ascii_chars = "MNHQ$OC67+>!:-. " img = Image.open(filename) w, h = img.size img = img.convert("L").resize((new_wight, int(new_wight*h//w))) w, h = img.size data = img.load() img_new = Image.new('L', (w * font_size, h * font_size), 255) f = ImageFont.truetype('arial.ttf', font_size) d = ImageDraw.Draw(img_new) n = len(ascii_chars)-1 for y in range(h): for x in range(w): char = ascii_chars[data[x, y]*n//255] d.text((x * font_size, y * font_size), char, fill=0, font=f) return img_new
測(cè)試一下:
img2charImg("love.jpg", 200, 2)
效果:
分別是原圖和執(zhí)行結(jié)果:
我們可以通過(guò)第二個(gè)參數(shù)調(diào)大字符程度,最終圖片的寬度是兩個(gè)參數(shù)相乘。
字符畫文字的生成
搞定了字符圖片的生成之后,我們考慮直接生成字符文字,但是ASCII碼字符在顯示時(shí),往往寬度是高度的一半,所以我們?cè)谏勺址嬑淖謺r(shí)需要事先將圖片高度壓扁一半。
完整代碼如下:
from PIL import Image def img2charTxt(filename, new_wight, txtname): "小小明:https://blog.csdn.net/as604049322" ascii_chars = "MNHQ$OC67+>!:-. " img = Image.open(filename) img = img.convert("L") w, h = img.size img = img.resize((new_wight*2, int(new_wight*h//w))) w, h = img.size data = img.load() result = [] n = len(ascii_chars)-1 for y in range(h): line = "".join(ascii_chars[data[x, y]*n//255] for x in range(w)) line += "\n" result.append(line) with open(txtname, "w") as f: f.writelines(result)
測(cè)試一下:
img2charTxt("test.jpg", 100, "image.txt")
可以看到在文本編輯器中的顯示效果是相當(dāng)不錯(cuò)的。
到此這篇關(guān)于Python實(shí)現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫的文章就介紹到這了,更多相關(guān)Python圖片轉(zhuǎn)換ASCII字符畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python3實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容轉(zhuǎn)換成PDF文檔和圖片
- python圖片格式轉(zhuǎn)換腳本
- Python將視頻轉(zhuǎn)換為圖片介紹
- Python實(shí)現(xiàn)圖片和視頻的相互轉(zhuǎn)換
- python中內(nèi)置函數(shù)ord()返回字符串的ASCII數(shù)值實(shí)例詳解
- Python如何存儲(chǔ)和讀取ASCII碼形式的byte數(shù)據(jù)
- Python 字節(jié)流,字符串,十六進(jìn)制相互轉(zhuǎn)換實(shí)例(binascii,bytes)
- python中ASCII碼和字符的轉(zhuǎn)換方法
- Python 十六進(jìn)制整數(shù)與ASCii編碼字符串相互轉(zhuǎn)換方法
相關(guān)文章
詳解Python實(shí)現(xiàn)字典合并的四種方法
這篇文章主要為大家詳細(xì)介紹了Python的合并字典的四種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03python基于paramiko庫(kù)遠(yuǎn)程執(zhí)行 SSH 命令,實(shí)現(xiàn) sftp 下載文件
這篇文章主要介紹了python基于paramiko庫(kù)遠(yuǎn)程執(zhí)行 SSH 命令,實(shí)現(xiàn) sftp 下載文件的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03Python3.5集合及其常見(jiàn)運(yùn)算實(shí)例詳解
這篇文章主要介紹了Python3.5集合及其常見(jiàn)運(yùn)算,結(jié)合實(shí)例形式分析了Python3.5集合的定義、功能、交集、并集、差集等常見(jiàn)操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-05-05Python采集熱搜數(shù)據(jù)實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Python采集熱搜數(shù)據(jù)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05PyQt4 treewidget 選擇改變顏色,并設(shè)置可編輯的方法
今天小編就為大家分享一篇PyQt4 treewidget 選擇改變顏色,并設(shè)置可編輯的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06python實(shí)現(xiàn)nao機(jī)器人身體軀干和腿部動(dòng)作操作
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)nao機(jī)器人身體軀干和腿部動(dòng)作操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04