python練手項目(1)——圖片轉(zhuǎn)字符畫

這個項目是在知乎上看到的,來源于實驗樓: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


Paste_Image.png
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小時長壽型

wm.png

發(fā)現(xiàn)了問題仗嗦,在使用這一張圖片的時候都會出現(xiàn)問題膘滨,然而并不知道為什么

Paste_Image.png

2016年10月9日18:07

更新

經(jīng)過測試,證明了這就是圖片的問題稀拐,wm.png這張圖片是直接在網(wǎng)頁上保存下來的

ascii_dora.png

而這張圖是從網(wǎng)站上提供的圖片地址上保存下來的

Paste_Image.png

難道是網(wǎng)站的原因火邓,又是一個謎

2016年10月9日18:15

更新

argparse——命令行選項、參數(shù)和子命令的解析器

argparse
模塊使得編寫用戶友好的命令行接口非常容易德撬。
程序只需定義好它要求的參數(shù)铲咨,然后argparse
將負(fù)責(zé)如何從sys.argv
中解析出這些參數(shù)。
argparse
模塊還會自動生成幫助和使用信息并且當(dāng)用戶賦給程序非法的參數(shù)時產(chǎn)生錯誤信息蜓洪。

Paste_Image.png
Paste_Image.png
#-*-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)    

coding里面的下面這一段看不太懂摇天,里面都是IMG這個庫里面的功能嗎粹湃?

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)換成字符畫。

Paste_Image.png
Paste_Image.png

附上pillow的文檔

ok畅姊,總算是把代碼弄懂了咒钟。只是'+='到底是什么意思?

2016年10月10日17:32

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末若未,一起剝皮案震驚了整個濱河市朱嘴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粗合,老刑警劉巖萍嬉,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隙疚,居然都是意外死亡壤追,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門供屉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來大诸,“玉大人,你說我怎么就攤上這事贯卦∽嗜幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵撵割,是天一觀的道長贿堰。 經(jīng)常有香客問我,道長啡彬,這世上最難降的妖魔是什么羹与? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任故硅,我火速辦了婚禮,結(jié)果婚禮上纵搁,老公的妹妹穿的比我還像新娘吃衅。我一直安慰自己,他們只是感情好腾誉,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布徘层。 她就那樣靜靜地躺著,像睡著了一般利职。 火紅的嫁衣襯著肌膚如雪趣效。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天猪贪,我揣著相機(jī)與錄音跷敬,去河邊找鬼。 笑死热押,一個胖子當(dāng)著我的面吹牛西傀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桶癣,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼池凄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鬼廓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤致盟,失蹤者是張志新(化名)和其女友劉穎碎税,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馏锡,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雷蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杯道。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匪煌。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖党巾,靈堂內(nèi)的尸體忽然破棺而出萎庭,到底是詐尸還是另有隱情,我是刑警寧澤齿拂,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布驳规,位于F島的核電站,受9級特大地震影響署海,放射性物質(zhì)發(fā)生泄漏吗购。R本人自食惡果不足惜医男,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捻勉。 院中可真熱鬧镀梭,春花似錦、人聲如沸踱启。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禽捆。三九已至笙什,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胚想,已是汗流浹背琐凭。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留浊服,地道東北人统屈。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像牙躺,于是被迫代替她去往敵國和親愁憔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容