#coding: utf-8
import argparse
from PIL import Image
class Converter(object):
def __init__(self,image,width,height,output,ascii_char=list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")):
self.image=image
self.width=width
self.height=height
self.ascii_char=ascii_char
self.output=output
def to_char(self,r,g,b,alpha=256):
if alpha == 0:
return ' '
ascii_len=len(self.ascii_char)
gray=int(0.2126*r+0.7152*g+0.0722*b)
denominator = (256.0+1)/ascii_len
return self.ascii_char[int(gray/denominator)]
def to_art(self):
image=Image.open(self.image)
image=image.resize((self.width,self.height),Image.NEAREST)
art=""
for i in range(self.height):
for j in range(self.width):
art+=self.to_char(*image.getpixel((j,i)))
art+='\n'
return art
def to_file(self,art):
if self.output:
with open(self.output,'w') as fd:
fd.write(art)
else:
with open('output.txt','w') as fd:
fd.write(art)
if __name__ == '__main__':
parser=argparse.ArgumentParser()
parser.add_argument('filepath',help='path of the target image')
parser.add_argument('-o','--output',help='where you want to save the result')
parser.add_argument('--width',type=int,default=80)
parser.add_argument('--height',type=int,default=80)
args=parser.parse_args()
converter=Converter(args.filepath,args.width,args.height,args.output)
print(converter.to_art())
改下那个ascii_char可以得到更好的效果,降低对比度,或者你找张色差大一点的原图
我用的是这一个