最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年04月21日 10:49:47   作者:David 612  
這篇文章主要介紹了Python簡單實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的實(shí)例項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 原理

利用 PIL 庫來獲取圖片并修改大小,
利用灰度值轉(zhuǎn)換公式把每一個(gè)像素的 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)入所需的庫

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

pip install pillow

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

from PIL import Image as Image

2.2 獲取圖片路徑和選項(xiàng)

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

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

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

2.3 圖片獲取

使用 PILopen 函數(shù)打開圖片

image = Image.open(inputfile)

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

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

獲取圖片大小

w, h = image.size

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

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

調(diào)整圖片大小

if len(nwh) == 1:
    #如果項(xiàng)數(shù)為1,表示用戶只輸入了一個(gè)數(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) 
    #改變圖片大小
    #第一個(gè)參數(shù)放入一個(gè)元組,指定寬高
    #第二個(gè)參數(shù) Image.ANTIALIAS 表示獲取高質(zhì)量圖片
else:
    #項(xiàng)數(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): #按行讀取每一個(gè)像素的RGB值
        p = image.getpixel((o,i))
        g = getasc(*p) # * 將參數(shù)列表轉(zhuǎn)換為多個(gè)項(xiàng)
        txt = txt + g + distance #連接字符
    txt = txt + '\n' #換行

函數(shù) getpixel 獲取指定位置的 RGB 值,它的第一個(gè)參數(shù)為元組,傳入像素位置 (x,y),如果圖片是 JPG 格式的,它會(huì)返回含三項(xiàng)的列表 [r,g,b],如果圖片是 PNG 格式的,它會(huì)返回含四項(xiàng)的列表 [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-32\Files\ji2a\ji2a.py ==================
=====image to ascii=====
inputfile:
dora.png
outputfile:
dora.txt
distance?(Y/n):
y
resize?(needn't:'', square:side length, restangle:width,height):
100

Opening 'dora.png'...
Getting...
Saving...
Seccessfully

原圖:

原圖

結(jié)果:

結(jié)果

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.size
        
        if 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) + distance
        txt = 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)字符畫程序完成了!

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

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

相關(guān)文章

  • opencv讀取視頻并保存圖像的方法

    opencv讀取視頻并保存圖像的方法

    實(shí)習(xí)項(xiàng)目要做安全帽目標(biāo)檢測,拿到了公司給的一些視頻數(shù)據(jù),使用Opencv讀取視頻并每隔1s存儲(chǔ)一副圖像,本文就詳細(xì)的介紹一下使用,感興趣的可以了解一下
    2021-06-06
  • 聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式

    聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式

    這篇文章主要介紹了聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • python?OpenCV圖像直方圖處理

    python?OpenCV圖像直方圖處理

    這篇文章主要介紹了python?OpenCV圖像直方圖處理,文章通過matplotlib畫一個(gè)直方圖展開詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • django session完成狀態(tài)保持的方法

    django session完成狀態(tài)保持的方法

    這篇文章主要介紹了django session完成狀態(tài)保持的方法,使用登錄頁面演示session的狀態(tài)保持功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • pytorch的Backward過程用時(shí)太長問題及解決

    pytorch的Backward過程用時(shí)太長問題及解決

    這篇文章主要介紹了pytorch的Backward過程用時(shí)太長問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 基于nexus3配置Python倉庫過程詳解

    基于nexus3配置Python倉庫過程詳解

    這篇文章主要介紹了基于nexus3配置Python倉庫過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 詳解python的變量

    詳解python的變量

    這篇文章主要為大家介紹了python中的變量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 批標(biāo)準(zhǔn)化層 tf.keras.layers.Batchnormalization()解析

    批標(biāo)準(zhǔn)化層 tf.keras.layers.Batchnormalization()解析

    這篇文章主要介紹了批標(biāo)準(zhǔn)化層 tf.keras.layers.Batchnormalization(),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • pip已經(jīng)安裝好第三方庫但pycharm中import時(shí)還是標(biāo)紅的解決方案

    pip已經(jīng)安裝好第三方庫但pycharm中import時(shí)還是標(biāo)紅的解決方案

    這篇文章主要介紹了python中pip已經(jīng)安裝好第三方庫但pycharm中import時(shí)還是標(biāo)紅的問題,本文給大家分享解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python使用socketServer包搭建簡易服務(wù)器過程詳解

    Python使用socketServer包搭建簡易服務(wù)器過程詳解

    這篇文章主要介紹了Python使用socketServer包搭建簡易服務(wù)器過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評論

洪湖市| 淮北市| 库伦旗| 凌海市| 万宁市| 沅江市| 临洮县| 扎赉特旗| 富源县| 遂宁市| 登封市| 鄱阳县| 溧水县| 五莲县| 象山县| 普兰店市| 昌图县| 丹东市| 五河县| 冀州市| 门源| 搜索| 当阳市| 寿阳县| 阳江市| 绥滨县| 白水县| 合肥市| 陆良县| 同江市| 年辖:市辖区| 额敏县| 南靖县| 昭觉县| 响水县| 崇州市| 历史| 兰溪市| 万宁市| 皮山县| 滦平县|