西普工程師想了解Python的命令行,以達到更好的對Python更深刻的認知,打算利用argparse庫實現圖片轉字符畫的實驗,結合Python的基礎知識實現並填寫工做報告。html
一、掌握Linux 命令行操做
二、掌握Python 基礎
三、掌握pillow 庫的使用
四、掌握argparse 庫的使用python
Ubuntu16.0四、Python2.7.13vim
圖片轉字符畫的關鍵思想是將圖片的灰度值與設定的字符集之間創建映射關係,不一樣區間的灰度值對應不一樣的字符,以後將圖片每個像素對應的字符打印出來就是須要的字符畫。ruby
♥ 知識連接 |
|
♥ 舒適提示 |
灰度值公式:0.2126 r + 0.7152 g + 0.0722 * b |
步驟一、環境準備函數
右擊Ubuntu操做系統桌面,從彈出菜單中選擇【Open in Terminal】命令 打開終端。測試
經過【cd /home】進入home目錄下,如圖1所示。網站
在home目錄下經過【mkdir ascii】建立文件夾,如圖2所示。ui
經過【cd ascii】進入ascii目錄下,在該目錄下經過【touch ascii.py】建立Python文件,該遊戲所需的圖片在目錄下,請自行拷貝至ascii目錄下,如圖3所示。編碼
編輯ascii.py文件,使用【vim ascii.py】,回車後進入到ascii的編輯框內,如圖4所示。spa
步驟二、Python 程序
在新建的ascii的Python文件中,寫入以下程序,如圖5所示。
# coding:utf-8 編碼設置爲utf-8,必須設置,有多中寫法。
導入程序須要的相關的第三方庫,Image、argparse等庫。
建立一個命令行參數,add_argument添加參數,文件的輸入輸出路徑,以及字符畫展現的高與寬,(argument庫具體操做可在
https://docs.python.org/2/library/argparse.html網站查看),如圖6所示。
獲取上步命令行的參數,將相關參數定義從新命名,爲如下程序進行調用。如圖7所示。
定義list集合,list集合中第一位元素將表示圖片中灰度值最低的像素點,其他依次類推。定義函數,將字符映射到元素的列表中,如圖8所示。
Python程序中的main方法,經過open函數打開圖片,並設置圖片高寬,依次對高寬進行循環寫入之txt中,getpixel()函數接受一個元組做爲輸入參數,該元組爲一個二維座標,函數將返回該座標處像素點的RGB三個值。如圖9所示。
將字符畫的信息輸出到文件中,如圖10所示。
程序源碼以下所示
# coding:utf-8
# 導入Image,圖片處理
from PIL import Image
# 導入argparse 命令行參數
import argparse
# 命令行輸入參數處理
parser = argparse.ArgumentParser()
parser.add_argument('filename') # 輸入文件
parser.add_argument('-o','--output') # 輸出文件
parser.add_argument('--width',type=int,default=50) # 輸出字符畫寬
parser.add_argument('--height',type=int,default=30) # 輸出字符畫高
# 獲取參數
args = parser.parse_args()
# 定義相關的參數
IMG= args.filename
OUTPUT = args.output
WIDTH = args.width
HEIGHT = args.height
# list中第一個元素是$.表示將使用$來道題原圖中灰度值最低的像素點,其他依此類推
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 將256個字符映射到70個字符上
def get_char(r,g,b,apcha = 256):
if apcha == 0:
return ''
length = len(ascii_char)
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) # RGB-灰度值 轉換公式
unit = (256.0 + 1) /length # ascii_char中的一個字符所能表示的灰度值區間
return ascii_char[int(gray/unit)]
if __name__ == '__main__':
im = Image.open(IMG)
im = im.resize((WIDTH,HEIGHT),Image.NEAREST)
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)
步驟一、運行程序
編輯完成後,按【esc】退出編輯狀態【:wq】保存並退出編輯框,執行【python ascii.py asci_image.png】運行Python文件,效果圖如12所示