Skip to content

Instantly share code, notes, and snippets.

@mowshon
Last active July 30, 2025 11:21
Show Gist options
  • Save mowshon/2a0664fab0ae799734594a5e91e518d5 to your computer and use it in GitHub Desktop.
Save mowshon/2a0664fab0ae799734594a5e91e518d5 to your computer and use it in GitHub Desktop.
Zoom-in Effect for Moviepy. This function makes the zoom effect smoother.
import moviepy.editor as mp
import math
from PIL import Image
import numpy
def zoom_in_effect(clip, zoom_ratio=0.04):
def effect(get_frame, t):
img = Image.fromarray(get_frame(t))
base_size = img.size
new_size = [
math.ceil(img.size[0] * (1 + (zoom_ratio * t))),
math.ceil(img.size[1] * (1 + (zoom_ratio * t)))
]
# The new dimensions must be even.
new_size[0] = new_size[0] + (new_size[0] % 2)
new_size[1] = new_size[1] + (new_size[1] % 2)
img = img.resize(new_size, Image.LANCZOS)
x = math.ceil((new_size[0] - base_size[0]) / 2)
y = math.ceil((new_size[1] - base_size[1]) / 2)
img = img.crop([
x, y, new_size[0] - x, new_size[1] - y
]).resize(base_size, Image.LANCZOS)
result = numpy.array(img)
img.close()
return result
return clip.transform(effect)
size = (1920, 1080)
images = [
'https://www.colorado.edu/cumuseum/sites/default/files/styles/widescreen/public/slider/coachwhip2_1.jpg',
'https://www.colorado.edu/cumuseum/sites/default/files/styles/widescreen/public/slider/green2_1.jpg',
'https://www.colorado.edu/cumuseum/sites/default/files/styles/widescreen/public/slider/westterrgarter_1.jpg',
'https://www.colorado.edu/cumuseum/sites/default/files/styles/widescreen/public/slider/prairierattle4.jpg'
]
slides = []
for n, url in enumerate(images):
slides.append(
mp.ImageClip(url).set_fps(25).set_duration(5).resize(size)
)
slides[n] = zoom_in_effect(slides[n], 0.04)
video = mp.concatenate_videoclips(slides)
video.write_videofile('zoomin.mp4')
@smrht
Copy link

smrht commented Jul 30, 2025

Thanks allot! this is great work

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment