这个项目是在知乎上看到的,来源于实验楼: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
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小时长寿型
发现了问题,在使用这一张图片的时候都会出现问题,然而并不知道为什么
2016年10月9日18:07
更新
经过测试,证明了这就是图片的问题,wm.png这张图片是直接在网页上保存下来的
而这张图是从网站上提供的图片地址上保存下来的
难道是网站的原因,又是一个谜
2016年10月9日18:15
更新
argparse
模块使得编写用户友好的命令行接口非常容易。
程序只需定义好它要求的参数,然后argparse
将负责如何从sys.argv
中解析出这些参数。
argparse
模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。
#-*-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)
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()函数的四个参数,再通过设置好的对应关系使图片被转换成字符画。
ok,总算是把代码弄懂了。只是'+='到底是什么意思?
2016年10月10日17:32