色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Python簡單實現(xiàn)圖片轉(zhuǎn)字符畫的實例項目

瀏覽:18日期:2022-06-21 17:18:17
1. 原理

利用 PIL 庫來獲取圖片并修改大小,利用灰度值轉(zhuǎn)換公式把每一個像素的 RGB 值轉(zhuǎn)為灰度值

gray = int(0.2126*r+0.7152*g+0.0722*b)

再從字符集里獲取對應(yīng)的字符

asciis = list(’M%$@#&WNBRwm8S5A4E3KXFPH69nsxeazgpqbdoctfhkyvuGZYVTUCI2QOD0L7Jjl1ri!^{}[]()/|;:*<>_~-,. ’)

最后將字符連接起來并保存就完成了

2. 開始制作2.1 導(dǎo)入所需的庫

在這個工程中,我們需要的第三方庫是 PIL 庫但我們不用 pip install PIL 來安裝它,而是使用 pip install pillow

pip install pillow

導(dǎo)入庫在導(dǎo)入 PIL 庫時,不能用 import pillow,應(yīng)使用 import PIL

from PIL import Image as Image2.2 獲取圖片路徑和選項

inputfile = input(’inputfile:’)outputfile = input(’outputfile:’)distance = {’y’:’ ’,’’:’ ’,’n’:’’}distance = distance[input(’distance?(Y/n):’)]re = input('resize?:')

字母占用的位置是矩形的,因此生成出來的字符畫會被“擠壓”。我們可以在字母與字母之間添加空格來防止這種情況的發(fā)生。如果圖片太大了,會導(dǎo)致耗費時間過長、亂碼等問題。我們應(yīng)該對圖片進行必要的縮放。在詢問“resize?”時,可以設(shè)置以下幾種回答:

回答方式 作用 “”,啥也不輸入 不縮放 “100”,邊長 輸入單個數(shù)字時,會按比例縮放為較長邊為此長度的矩形 “100,200”,寬和高 縮放為指定寬高的矩形

2.3 圖片獲取

使用 PIL 的 open 函數(shù)打開圖片

image = Image.open(inputfile)

注意:這里的 open 函數(shù)不要和 python 內(nèi)置函數(shù) open 混淆

2.4 調(diào)整圖片大小

獲取圖片大小

w, h = image.size

獲取變量 re 中存儲的大小信息,并用函數(shù) split 分割

nwh = re.split(’,’)for i in range(len(nwh)): nwh[i] = int(nwh[i])

調(diào)整圖片大小

if len(nwh) == 1: #如果項數(shù)為1,表示用戶只輸入了一個數(shù)字。即按比例縮放為較長邊為此長度的矩形 ww = int(nwh[0] / max(w,h) * w) #max函數(shù)獲取較大值 hh = int(nwh[0] / max(w,h) * h) image = image.resize((ww,hh),Image.ANTIALIAS) #改變圖片大小 #第一個參數(shù)放入一個元組,指定寬高 #第二個參數(shù) Image.ANTIALIAS 表示獲取高質(zhì)量圖片else: #項數(shù)不為1,縮放為指定寬高的矩形 image = image.resize((nwh[0],nwh[1]),Image.ANTIALIAS)2.5 轉(zhuǎn)換字符

指定轉(zhuǎn)換的字符集

asciis = list(’M%$@#&WNBRwm8S5A4E3KXFPH69nsxeazgpqbdoctfhkyvuGZYVTUCI2QOD0L7Jjl1ri!^{}[]()/|;:*<>_~-,. ’)#list函數(shù)將字符串轉(zhuǎn)換為列表

定義轉(zhuǎn)換字符的函數(shù)

def getasc(r,g,b,t=100): #t為透明度 if t == 0:return(’ ’) #如果是透明的,則直接返回空值 else:asc = ’’gray = int(0.2126*r+0.7152*g+0.0722*b) #轉(zhuǎn)灰度值asc = asciis[int(len(asciis)/256*(gray))] #獲取字符return(asc)

開始轉(zhuǎn)換字符

for i in range(h): for o in range(w): #按行讀取每一個像素的RGB值p = image.getpixel((o,i))g = getasc(*p) # * 將參數(shù)列表轉(zhuǎn)換為多個項txt = txt + g + distance #連接字符 txt = txt + ’n’ #換行

函數(shù) getpixel 獲取指定位置的 RGB 值,它的第一個參數(shù)為元組,傳入像素位置 (x,y),如果圖片是 JPG 格式的,它會返回含三項的列表 [r,g,b],如果圖片是 PNG 格式的,它會返回含四項的列表 [r,g,b,t],t 是透明度

2.6 保存文本

使用 python 內(nèi)置函數(shù) open 保存文件

with open(outputfile,’w’) as f: # ’w’ 表示寫入 f.write(txt)2.7 效果

================== RESTART: D:Python38-32Filesji2aji2a.py =======================image to ascii=====inputfile:dora.pngoutputfile:dora.txtdistance?(Y/n):yresize?(needn’t:’’, square:side length, restangle:width,height):100

Opening ’dora.png’...Getting...Saving...Seccessfully

原圖:

Python簡單實現(xiàn)圖片轉(zhuǎn)字符畫的實例項目

結(jié)果:

Python簡單實現(xiàn)圖片轉(zhuǎn)字符畫的實例項目

3. 完整代碼

from PIL import Image as Image asciis = list(’M%$@#&WNBRwm8S5A4E3KXFPH69nsxeazgpqbdoctfhkyvuGZYVTUCI2QOD0L7Jjl1ri!^{}[]()/|;:*<>_~-,. ’)#gray = int(0.2126*r+0.7152*g+0.0722*b)def main(): global asciis print(’=====image to ascii=====’)inputfile, outputfile, distance, re = getargs() image = openfile(inputfile) image = resize(image,re) w, h = image.size txt = gettxt(image,w,h,distance) savefile(outputfile,txt) print(’Seccessfully’)def getargs(): inputfile = input(’inputfile:n’) outputfile = input(’outputfile:n’) distance = {’’:’ ’,’y’:’ ’,’n’:’’} distance = distance[input(’distance?(Y/n):n’)] re = input('resize?(needn’t:’’, square:side length, restangle:width,height):n') return(inputfile,outputfile,distance,re)def openfile(inputfile): print('nOpening ’'+inputfile+'’...') image = Image.open(inputfile) return(image)def resize(image,re): if re != ’’:print(’Resizing...’)nwh = re.split(’,’)for i in range(len(nwh)):nwh[i]=int(nwh[i])w, h = image.sizeif len(nwh) == 1: ww = int(nwh[0] / max(w,h) * w) hh = int(nwh[0] / max(w,h) * h) image = image.resize((ww,hh),Image.ANTIALIAS)else: image = image.resize((nwh[0],nwh[1]),Image.ANTIALIAS) return(image)def gettxt(image,w,h,distance):txt = ’’ print(’Getting...’) for i in range(h):for o in range(w): p = image.getpixel((o,i)) txt = txt + getasc(*p) + distancetxt = txt + ’n’ return(txt)def getasc(r,g,b,t=100): if t == 0:return(’ ’) else:asc = ’’gray = int(0.2126*r+0.7152*g+0.0722*b)asc = asciis[int(len(asciis)/256*(gray))]return(asc)def savefile(outputfile,txt): print(’Saving...’)with open(outputfile,’w’) as f:f.write(txt) return()if __name__ == ’__main__’: main()

此代碼在 Python3.8 下調(diào)試通過

4. 后記

我們的圖片轉(zhuǎn)字符畫程序完成了!

要想將它打造成一個真正的命令行工具,可以加入命令行參數(shù)功能,利用 sys 模塊的 argv 函數(shù)獲取命令行參數(shù),利用 getopt 模塊的 getop 函數(shù)解析命令行參數(shù)。

到此這篇關(guān)于Python簡單實現(xiàn)圖片轉(zhuǎn)字符畫的實例項目的文章就介紹到這了,更多相關(guān)Python 圖片轉(zhuǎn)字符畫內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲欧美视频在线观看 | 国产成人3p视频免费观看 | 老太婆性杂交毛片 | 国语自产精品视频 | 日韩国产免费一区二区三区 | 免费的成人a视频在线观看 免费的毛片 | 91亚洲成人 | 亚洲在线影院 | 亚洲线精品久久一区二区三区 | 久草在线免费播放 | 国产高颜值露脸在线观看 | 日产乱码精品一二三区 | 欧美精品v欧洲精品 | 香港黄页亚洲一级 | 人人草97| 国产91成人| 欧美一级视频在线高清观看 | 国产精品二区页在线播放 | 欧美高清视频手机在在线 | 99精品免费久久久久久久久日本 | 亚洲精品自拍 | 手机在线观看精品国产片 | 国产亚洲精品久久久久久久网站 | 看一级毛片一区二区三区免费 | 国产亚洲精品自在线观看 | 99热久久国产这里是精品 | xxx国产老太婆视频 xxx欧美老熟 | 免费播放毛片 | 美国毛片基地a级e片 | 新婚第一次一级毛片 | 欧美一级毛片免费播放aa | 欧美精品人爱a欧美精品 | 国产成人精品免费 | 亚洲国产欧洲综合997久久 | 在线观看国产一区二三区 | 中文字幕亚洲欧美日韩不卡 | 欧美久久视频 | 一区二区三区在线 | 日本 | 久久久亚洲精品蜜桃臀 | 好吊妞998视频免费观看在线 | 国产一有一级毛片视频 |