参考

准备

  • 安装ffmpeg

  • 准备python

  • 安装PIL

  • 安装numpy

代码

from PIL import Image, ImageDraw, ImageFont
import argparse
import numpy as np

sample_rate = 0.4

def ascii_art(file):
im = Image.open(file)

\# Compute letter aspect ratio  
font = ImageFont.load\_default()  
\# font = ImageFont.truetype("SourceCodePro-Bold.ttf", size=12)  
aspect\_ratio = font.getsize("x")\[0\] / font.getsize("x")\[1\]  
new\_im\_size = np.array(  
    \[im.size\[0\] \* sample\_rate, im.size\[1\] \* sample\_rate \* aspect\_ratio\]  
).astype(int)  

\# Downsample the image  
im = im.resize(tuple(new\_im\_size))  

\# Keep a copy of image for color sampling  
im\_color = np.array(im)  

\# Convert to gray scale image  
im = im.convert("L")  

\# Convert to numpy array for image manipulation  
im = np.array(im)  

\# Defines all the symbols in ascending order that will form the final ascii  
symbols = np.array(list(" .-vM"))  

\# Normalize minimum and maximum to \[0, max\_symbol\_index)  
im = (im - im.min()) / (im.max() - im.min()) \* (symbols.size - 1)  

\# Generate the ascii art  
ascii = symbols\[im.astype(int)\]  

\# Create an output image for drawing ascii text  
letter\_size = font.getsize("x")  
im\_out\_size = new\_im\_size \* letter\_size  
bg\_color = "black"  
im\_out = Image.new("RGB", tuple(im\_out\_size), bg\_color)  
draw = ImageDraw.Draw(im\_out)  

\# Draw text  
y = 0  
for i, line in enumerate(ascii):  
    for j, ch in enumerate(line):  
        color = tuple(im\_color\[i, j\])  \# sample color from original image  
        draw.text((letter\_size\[0\] \* j, y), ch\[0\], fill=color, font=font)  
    y += letter\_size\[1\]  \# increase y by letter height  

\# Save image file  
im\_out.save(file\[0:10\] + ".jpg")  

if __name__ == “__main__“:
# parser = argparse.ArgumentParser(description=”Convert any image to ascii art.”)
# parser.add_argument(
# “file”, type=str, help=”input image file”,
# )
# args = parser.parse_args()
# 上面的内容表示file参数的输入

\# 也可以直接在脚本内部定义  
for i in range(47, 60):  
    file = "./img/{:0>4d}.jpg".format(i)  \# 这里是定义了内部的文件路径  
    ascii\_art(file)  

ffmpeg

获取图片中的每一帧

ffmpeg -i <文件路径> -r 25 -qscale:v 2 out/%04d.jpg

将图片生成为视频,libx264

ffmpeg -i %04d.jpg -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4