一、任務描述
西普工程師想了解Python的命令行,以達到更好的對Python更深入的認知,打算利用argparse庫實現圖片轉字符畫的實驗,結合Python的基礎知識實現並填寫工作報告。
二、 任務目標
1、掌握Linux 命令行操作
2、掌握Python 基礎
3、掌握pillow 庫的使用
4、掌握argparse 庫的使用
三、 任務環境
Ubuntu16.04、Python2.7.13
四、任務分析
圖片轉字符畫的關鍵思想是將圖片的灰度值與設定的字符集之間建立映射關系,不同區間的灰度值對應不同的字符,之后將圖片每一個像素對應的字符打印出來就是需要的字符畫。
♥ 知識鏈接 |
|
♥ 溫馨提示 |
灰度值公式:0.2126 r + 0.7152 g + 0.0722 * b |
五、任務實施
步驟1、環境准備
右擊Ubuntu操作系統桌面,從彈出菜單中選擇【Open in Terminal】命令 打開終端。
通過【cd /home】進入home目錄下,如圖1所示。

在home目錄下通過【mkdir ascii】創建文件夾,如圖2所示。

通過【cd ascii】進入ascii目錄下,在該目錄下通過【touch ascii.py】創建Python文件,該游戲所需的圖片在目錄下,請自行拷貝至ascii目錄下,如圖3所示。

編輯ascii.py文件,使用【vim ascii.py】,回車后進入到ascii的編輯框內,如圖4所示。

步驟2、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)
六、任務測試
步驟1、運行程序
編輯完成后,按【esc】退出編輯狀態【:wq】保存並退出編輯框,執行【python ascii.py asci_image.png】運行Python文件,效果圖如12所示
