在上次的教程中,我们只是将图像转换为txt文本文件,而txt文本文件是没有颜色的。
在显示某些图片的时候,我们往往希望可以包含颜色信息。
这样图像便显得更加生动。
接下来我便教大家如何将图像转换字符画的时候,同时具有颜色,输出一幅带色彩的字符画。
以下是具体代码:
import os
from PIL import Image, ImageFont, ImageDraw
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file')
parser.add_argument('-o','--output')
args = parser.parse_args()
File = args.file
OUTPUT = args.output
ascii_char = list("MNHQ$OC67)oa+>!:+. ")
def get_char(r,g,b,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(File)
WIDTH = int(im.width/6)
HEIGHT = int(im.height/15)
im_txt = Image.new("RGB",(im.width,im.height),(255,255,255))
im = im.resize((WIDTH,HEIGHT),Image.NEAREST)
txt = ""
colors = []
for i in range(HEIGHT):
for j in range(WIDTH):
pixel = im.getpixel((j,i))
colors.append((pixel[0],pixel[1],pixel[2]))
if(len(pixel) == 4):
txt += get_char(pixel[0],pixel[1],pixel[2],pixel[3])
else:
txt += get_char(pixel[0],pixel[1],pixel[2])
txt += '\n'
colors.append((255,255,255))
dr = ImageDraw.Draw(im_txt)
font=ImageFont.load_default().font
x=y=0
font_w,font_h=font.getsize(txt[1])
font_h *= 1.37
for i in range(len(txt)):
if(txt[i]=='\n'):
x+=font_h
y=-font_w
dr.text([y,x],txt[i],colors[i])
y+=font_w
im_txt.save("output.png")
要达成如上效果,一下几点很重要:
colors.append((pixel[0],pixel[1],pixel[2]))#记录像素颜色信息
同时这次使用ImageDraw为每个ascii码进行上色,同时将文本文件转换为图像进行输出:
for i in range(len(txt)):
if(txt[i]=='\n'):
x+=font_h
y=-font_w
dr.text((y,x),txt[i],font = font, fill = colors[i])
y+=font_w
im_txt.save("output.png")
在上述代码中,为了使画面达到预期的效果,需要对图像进行一定的调整:
WIDTH = int(im.width/6)
#高度比例为原图的1/6较好,由于字体宽度
HEIGHT = int(im.height/15)
#高度比例为原图的1/15较好,由于字体高度
font_h *= 1.37
#通过实际操作,这样调整后更佳
以下是具体效果:
以上代码使用后你会发现一个问题,它只可以转换静态图,如png,jpg,jpeg等,但是无法转换gif这类动态图。
下篇文章,我将教大家如何将gif图也同样的转换为字符画。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)