Skip to content

Instantly share code, notes, and snippets.

@xziyue
Last active January 31, 2021 06:13
Show Gist options
  • Save xziyue/23e3e98938f981d0e0dd6faeb26d9e46 to your computer and use it in GitHub Desktop.
Save xziyue/23e3e98938f981d0e0dd6faeb26d9e46 to your computer and use it in GitHub Desktop.
renders the string for video frames
# used in conjunction with https://gist.github.com/xziyue/0e83c7c6938d125b05d5bcad5e12e43a
import pickle
from PIL import Image, ImageFont, ImageDraw, ImageOps
import os
from multiprocessing import Pool
def generate_render_param(text_dim, font, fontsize, spacing):
test_str = '\n'.join([' ' * text_dim[1] for _ in range(text_dim[0])])
test_font = ImageFont.truetype(font, fontsize)
dummy_img = Image.new('L', (1, 1))
dummy_draw = ImageDraw.Draw(dummy_img)
dummy_image_size = dummy_draw.multiline_textsize(test_str, test_font, spacing=spacing)
ret = {
'image_font': test_font,
'image_size': dummy_image_size,
'spacing': spacing
}
return ret
def render_text(param, text):
img = Image.new('L', param['image_size'], 255)
draw = ImageDraw.Draw(img)
draw.multiline_text((0, 0), text, font=param['image_font'], spacing=param['spacing'])
return img
def generate_frame_task(render_param_args, i, str):
render_param = generate_render_param(**render_param_args)
img = render_text(render_param, str)
inv_img = ImageOps.invert(img)
inv_img.save(os.path.join(os.getcwd(), 'frames', 'frame{:03d}.png'.format(i)))
if __name__ == '__main__':
with open('frames.pickle', 'rb') as infile:
final_result = pickle.load(infile)
if not os.path.exists('frames'):
os.mkdir('frames')
pool = Pool(10)
params = [(final_result['render_param_args'], i, final_result['frames'][i]) for i in
range(len(final_result['frames']))]
pool.starmap(generate_frame_task, params, chunksize=20)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment