美文网首页
python练手项目(1)——图片转字符画

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

作者: 小重山_ | 来源:发表于2016-10-09 12:34 被阅读0次

    这个项目是在知乎上看到的,来源于实验楼: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

    相关文章

      网友评论

          本文标题:python练手项目(1)——图片转字符画

          本文链接:https://www.haomeiwen.com/subject/wavpyttx.html