Python-图片转字符画

这个是从某个学习站点弄下来的,具体忘了是哪个了 。=.=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#coding:utf-8
from PIL import Image
import argparse
#命令行输入参数处理
parser = argparse.ArgumentParser()
#add_argument:读入命令行参数,该调用有多个参数
parser.add_argument('file') #输入文件
parser.add_argument('-o', '--output') #输出文件
parser.add_argument('--width', type = int, default = 80) #输出字符画宽
parser.add_argument('--height', type = int, default = 45) #输出字符画高
#获取参数
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
'''
一张图片从图像到字符不是一蹴而就的,需要经过很多步骤,
光看着可能没什么头绪,先从成品上着手,成品是一系列字符的组合,
我们可以把字符看作是比较大块的像素,
一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,
可以表现的颜色也越多,图片也会更有层次感,下面是我们选择的字符集。
'''
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
'''
没有自己用手去数吧?告诉你,一共有 70 个字符,当然也不是字符越多越好,具体还得看选择的图片,自己反复尝试效果。
问题来了,我们是要转换一张彩色的图片,这么这么多的颜色,要怎么对应到字符上去?这里就要介绍灰度值的概念了。
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
这样就好办了,灰度值大的用列表开头的符号,灰度值小的用列表末尾的符号。
灰度值公式:灰度值 = 0.2126 * r + 0.7152 * g + 0.0722 * b
'''
# 将256灰度映射到70个字符上,RGB值转字符的函数
def get_char(r,b,g,alpha = 256):
if alpha == 0:
return ' '
length = len(ascii_char)
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = (256.0 + 1)/length
return ascii_char[int(gray/unit)]
if __name__ == '__main__':
im = Image.open(IMG)
im = im.resize((WIDTH,HEIGHT), Image.NEAREST)
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j,i)))
txt += '\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)

!坚持技术分享,您的支持将鼓励我继续创作!