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

转自:https://www.jianshu.com/p/0864b681430b

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




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值