-
Notifications
You must be signed in to change notification settings - Fork 0
/
toy.py
65 lines (51 loc) · 1.88 KB
/
toy.py
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
'''
Create on 4/29/2016
@author = Tao
'''
from PIL import Image,JpegImagePlugin
import sys
def img_to_asciiart(image, height_num, width_num=0,charset="MMMWNXK0Okxdolc:;,'... ", out=sys.stdout):
'''
convert an image to asciiart
:param image: The image to be converted. Type `PIL.JpegImagePlugin.JpegImageFile` required
:param height_num: Amount of chars per column
:param width_num: Amount of chars per row. **Make it 0 if require proportion
:param charset: The charset to be used in asciiart. **It is recommended to sort the chars in order of ascendant 'grayscale'
:param out: Where to output. Defaultly it is `sys.stdout`.
:return: None
'''
if not isinstance(height_num, int):
raise TypeError('Parameter `height_num` requires type of `int`')
if not isinstance(width_num,int):
raise TypeError('Parameter `width_num` requries type of `int`')
# convert to greyscale
image = image.convert('L')
# calculate the number of char on height and width
height,width = image.size
hstep = int(height / height_num)
wstep = 0
if width_num==0:
width_num = int(width/hstep)
wstep = hstep
else:
wstep = int(width/width_num)
gray_step = 256/len(charset)
# store the result
draw = [[' ' for i in range(height_num)] for i in range(width_num)]
for h in range(height_num):
for w in range(width_num):
gray = 0
for i in range(hstep):
for j in range(wstep):
gray += image.getpixel((h*hstep+i,w*wstep+j))
gray = int(gray/(hstep*wstep*gray_step))
draw[w][h] = charset[gray]
for l in draw:
out.write(''.join(l))
out.write('\n')
if __name__ == '__main__':
image = Image.open('test.png')
print(image)
fout = open('res.txt','w')
img_to_asciiart(image, 50, 45,out=fout)
fout.close()