這個項目是在知乎上看到的,來源于實驗樓:python:圖片轉(zhuǎn)字符畫皿淋。
說實話真的看不懂代碼啊,才發(fā)現(xiàn)我對python真的是啥也不會啊恬试。我是不是應(yīng)該先回去把笨辦法學(xué)python里的代碼先敲過一遍再說窝趣。
先把代碼貼上來,等能看懂了再回來解析训柴。
#-*-coding:utf-8-*-
from PIL import Image
import argparse#命令行輸入?yún)?shù)處理
parser = argparse.ArgumentParser()
parser.add_argument('file') #輸入文件
parser.add_argument('-O', '--output') #輸出文件
parser.add_argument('--width', type = int, default = 80) #輸出字符畫寬
parser.add_argument('--height', type = int, default= 80) #輸出字符畫高
#獲取參數(shù)
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
ascii_chr = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft^|()1{}[]?-_+~<>i!Ll;:,/EFGS")
#將256灰度映射到70個字符上
def get_char(r, g, b, alpha = 256):
if alpha == 0:
return ''
length = len(ascii_chr)
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = (256.0 + 1)/length
return ascii_chr[int(gray/unit)]
if __name__ == '__main__':
im = Image.open(IMG)
im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
text = ""
for i in range(HEIGHT):
for j in range(WIDTH):
text += get_char(*im.getpixel((j, i)))
text += '\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)
2016年10月9日12:33
更新
目前遇到的問題:代碼在筆記本上可以運行哑舒,在surface上卻遇到了問題。使用的python版本是一樣的幻馁,都是python3.5
Traceback (most recent call last):
File ".\ascii.py", line 43, in <module>
text += get_char(* im.getpixel((j, i)))
TypeError: get_char() argument after * must be an iterable, not int
2016年10月9日17:48
更新
我去洗鸵,臺燈的燈泡燒了,尼瑪說好的1500小時長壽型
發(fā)現(xiàn)了問題仗嗦,在使用這一張圖片的時候都會出現(xiàn)問題膘滨,然而并不知道為什么
2016年10月9日18:07
更新
經(jīng)過測試,證明了這就是圖片的問題稀拐,wm.png這張圖片是直接在網(wǎng)頁上保存下來的
而這張圖是從網(wǎng)站上提供的圖片地址上保存下來的
難道是網(wǎng)站的原因火邓,又是一個謎
2016年10月9日18:15
更新
argparse——命令行選項、參數(shù)和子命令的解析器
argparse
模塊使得編寫用戶友好的命令行接口非常容易德撬。
程序只需定義好它要求的參數(shù)铲咨,然后argparse
將負(fù)責(zé)如何從sys.argv
中解析出這些參數(shù)。
argparse
模塊還會自動生成幫助和使用信息并且當(dāng)用戶賦給程序非法的參數(shù)時產(chǎn)生錯誤信息蜓洪。
#-*-coding:utf-8-*-
from PIL import Image
import argparse#命令行輸入?yún)?shù)處理
parser = argparse.ArgumentParser()
parser.add_argument('file') #輸入文件
parser.add_argument('-O', '--output') #輸出文件
parser.add_argument('--width', type = int, default = 80) #輸出字符畫寬
parser.add_argument('--height', type = int, default= 80) #輸出字符畫高
#獲取參數(shù)
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
代碼的開頭引用argparse模塊纤勒,通過add_argument方法對命令行輸入的參數(shù)進(jìn)行處理。然后將這些參數(shù)賦予各種變量隆檀。
2016年10月10日16:39
更新
if __name__ == '__main__':
im = Image.open(IMG)
im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
text = ""
for i in range(HEIGHT):
for j in range(WIDTH):
text += get_char(*im.getpixel((j, i)))
text += '\n'
print (txt)
im = Image.open(Img)
打開圖片
im = im.resize((Width, Height), Image.NEAREST)
使用resize()方法重新設(shè)置圖片大小,其中第一個參數(shù)應(yīng)是一個尺寸元組闸翅,而第二個參數(shù)resample有四個選項再芋,分別是Image.NEAREST、Image.BILINEAR坚冀、Image.BICUBIC济赎、Image.LANCZOS,默認(rèn)是第一個记某,第四個質(zhì)量最高司训。
for i in range(Height):
for j in range(Width):
Text += get_char(*im.getpixel((j, i )))
Text += "\n"
這段代碼是使用getpixel()方法獲取某坐標(biāo)像素點的RGBA值(PNG是一種使用RGBA的圖像格式,其中A是指alpha即色彩空間)液南,然后使用get_char函數(shù)將這個值轉(zhuǎn)換成字符壳猜,換行時加上換行符。 其中g(shù)etpixel()方法會返回四個元素的元組滑凉,而get_char(im.getpixel((j, i )))使用了則會把返回的元組元素依次賦給get_char()函數(shù)的四個參數(shù)统扳,再通過設(shè)置好的對應(yīng)關(guān)系使圖片被轉(zhuǎn)換成字符畫。
ok畅姊,總算是把代碼弄懂了咒钟。只是'+='到底是什么意思?
2016年10月10日17:32