单单只是将静态图转换为字符画,功能貌似太过单一。
于是,小编便想着,既然静态图可以转换为字符画,那么动态图是否也可以呢。
毕竟,动态图不也就是许多静态图拼凑在一起生成的吗?
本次教学中,我将教大家如何简单的实现将动态图也转换为字符画。
以下是具体代码,我都做了详细注释,可以将图片保存下来慢慢看,遇到什么问题也可以私信我:
from PIL import Image, ImageFont, ImageDraw
import argparse
import os
import imageio
parser = argparse.ArgumentParser()
parser.add_argument('file')
parser.add_argument('-d','--duration',type = float, default = 1)
args = parser.parse_args()
File = args.file
DURARION = args.duration
ascii_char = list("MNHQ$OC67+>!:-. ")
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)]
def txt2png(file_name):
im = Image.open(file_name).convert('RGB')
raw_width = im.width
raw_height = im.height
width = int(raw_width/6)
height = int(raw_height/15)
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))
im_txt = Image.new("RGB",(raw_width,raw_height),(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
name = file_name.split('.')[0]+'-txt'+'.png'
print(name)
im_txt.save(name)
def gif2png(file_name):
im = Image.open(file_name)
path = os.getcwd()
if(not os.path.exists(path+"/Cache")):
os.mkdir(path+"/Cache")
os.chdir(path+"/Cache")
try:
while 1:
current = im.tell()
name = file_name.split('.')[0]+'-'+str(current)+'.png'
im.save(name)
print(name)
txt2png(name)
im.seek(current+1)
except:
os.chdir(path)
def png2gif(dir_name):
path = os.getcwd()
os.chdir(dir_name)
dirs = os.listdir()
images = []
num = 0
for d in dirs:
if d.split('-')[-1] == 'txt.png':
images.append(imageio.imread(d))
num += 1
os.chdir(path)
imageio.mimsave(d.split('-')[0]+'-txt_c.gif',images,duration = DURARION)
if __name__=='__main__':
gif2png(File)
path = os.getcwd()
png2gif(path+"/Cache")
其实上述的编程思想很简单,只需要掌握步骤,你也可以轻松的实现以上功能,大体思想如下:
其中的关键在以下几点:
1、将gif图片拆分
2、将gif图片合成,其中duration的设定
- 通过加入参数-d来规定,具体操作如下:
python ascii-gif.py 1.gif -d 0.1
意为生成循环周期为0.1秒的gif图片
可能的问题:
window平台下在cmd终端使用pip安装imageio库时,可能会出现UnicodeDecodeError
解决方法:
安装的python路径里面的:\lib\site-packages\pip\compat__init__.py”, line 75中的utf-8改为gbk
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)