python练手项目(1)——图片转字符画

这个项目是在知乎上看到的,来源于实验楼:python:图片转字符画
说实话真的看不懂代码啊,才发现我对python真的是啥也不会啊。我是不是应该先回去把笨办法学python里的代码先敲过一遍再说。

先把代码贴上来,等能看懂了再回来解析。

#-*-coding:utf-8-*-
from PIL import Image
import argparse#命令行输入参数处理
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)  #输出字符画高
#获取参数
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

发现了问题,在使用这一张图片的时候都会出现问题,然而并不知道为什么

Paste_Image.png

2016年10月9日18:07

更新

经过测试,证明了这就是图片的问题,wm.png这张图片是直接在网页上保存下来的

ascii_dora.png

而这张图是从网站上提供的图片地址上保存下来的

Paste_Image.png

难道是网站的原因,又是一个谜

2016年10月9日18:15

更新

argparse——命令行选项、参数和子命令的解析器

argparse
模块使得编写用户友好的命令行接口非常容易。
程序只需定义好它要求的参数,然后argparse
将负责如何从sys.argv
中解析出这些参数。
argparse
模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。

Paste_Image.png
Paste_Image.png
#-*-coding:utf-8-*-
from PIL import Image
import argparse#命令行输入参数处理
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)  #输出字符画高
#获取参数
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output

代码的开头引用argparse模块,通过add_argument方法对命令行输入的参数进行处理。然后将这些参数赋予各种变量。

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()方法重新设置图片大小,其中第一个参数应是一个尺寸元组,而第二个参数resample有四个选项,分别是Image.NEAREST、Image.BILINEAR、Image.BICUBIC、Image.LANCZOS,默认是第一个,第四个质量最高。

for i in range(Height):
for j in range(Width):
Text += get_char(*im.getpixel((j, i )))
Text += "\n"
这段代码是使用getpixel()方法获取某坐标像素点的RGBA值(PNG是一种使用RGBA的图像格式,其中A是指alpha即色彩空间),然后使用get_char函数将这个值转换成字符,换行时加上换行符。 其中getpixel()方法会返回四个元素的元组,而get_char(im.getpixel((j, i )))使用了则会把返回的元组元素依次赋给get_char()函数的四个参数,再通过设置好的对应关系使图片被转换成字符画。

Paste_Image.png
Paste_Image.png

附上pillow的文档

ok,总算是把代码弄懂了。只是'+='到底是什么意思?

2016年10月10日17:32

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,351评论 0 17
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,653评论 0 15
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • “像个孩子,被人装在树脂涂敷的篮子里,顺水漂来我的床榻之岸。”于是托马斯有了不可抗拒的动力,促使他再没办法抗...
    shawndue阅读 391评论 0 1