Last active
February 28, 2024 22:16
-
-
Save michaelosthege/cd3e0c3c556b70a79deba6855deb2cc8 to your computer and use it in GitHub Desktop.
Convert MP4/AVI clips to GIF with a single Python function
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import imageio | |
import os, sys | |
class TargetFormat(object): | |
GIF = ".gif" | |
MP4 = ".mp4" | |
AVI = ".avi" | |
def convertFile(inputpath, targetFormat): | |
"""Reference: http://imageio.readthedocs.io/en/latest/examples.html#convert-a-movie""" | |
outputpath = os.path.splitext(inputpath)[0] + targetFormat | |
print("converting\r\n\t{0}\r\nto\r\n\t{1}".format(inputpath, outputpath)) | |
reader = imageio.get_reader(inputpath) | |
fps = reader.get_meta_data()['fps'] | |
writer = imageio.get_writer(outputpath, fps=fps) | |
for i,im in enumerate(reader): | |
sys.stdout.write("\rframe {0}".format(i)) | |
sys.stdout.flush() | |
writer.append_data(im) | |
print("\r\nFinalizing...") | |
writer.close() | |
print("Done.") | |
convertFile("C:\\Users\\Yoda\\Desktop\\EwokPr0n.mp4", TargetFormat.GIF) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Under the hood all the GIF-writing methods use
PIL
.The link above does it too, but falls short on the quality of the output. Here's some troubleshooting insight I earned painfully a few days ago:
Problem 1: Transparency of frames
Symptom: Output GIF has bad quality on texts. Looks like really bad antialiasing.
Reason: The alpha channel of frames is just cut away by pillow, but unless there wasn't any transparency this is not the correct way to remove transparency.
Solution: Make sure to create frames (e.g. matplotlib figures) with white background so cutting away the alpha channel doesn't break the colors.
Problem 2: Grizzly output GIFs
Symptom: Output GIF has artifacts, even though the frames didn't. (Like in the example from the link above.)
Reason: ???
Solution: Try to call
.quantize()
on thePIL.Image
frames.