Source code for pycharmers.cli.video2gif

#coding: utf-8
import os
import sys
import cv2
import argparse
from PIL import Image

from ..utils._colorings import toBLUE, toGREEN
from ..utils.argparse_utils import ListParamProcessorCreate
from ..utils.generic_utils import filenaming
from ..utils.print_utils import pretty_3quote
from ..utils.monitor_utils import ProgressMonitor

[docs]def video2gif(argv=sys.argv[1:]): """Convert Video into Gif. Args: video (str) : Path to the video. --gif (str) : Path to the output image. --resize (int) : Enter a size separated by a comma ( ``width`` , ``height`` ) --loop (int) : How many times gif image loops. --speed (int) : How many images will pass to get one. (The higher the number, the faster the speed). --twitter (bool) : Whether you want to run for tweet. ( ``resize`` will be ( ``1300`` , ``730`` ) ) Note: When you run from the command line, execute as follows:: $ video2gif path/to/video.mp4 --gif path/to/gif.gif --twitter """ parser = argparse.ArgumentParser(prog="video2gif", description="Convert Video into Gif.", add_help=True) parser.add_argument("video", type=str, help="Path to the video.") parser.add_argument("--gif", type=str, help="Path to the output image.") parser.add_argument("--resize", action=ListParamProcessorCreate(type=int), help="Enter a size separated by a comma (width,height)") parser.add_argument("--loop", type=int, default=0, help="How many times gif image loops.") parser.add_argument("--speed", type=int, default=5, help="How many images will pass to get one. (The higher the number, the faster the speed).") parser.add_argument("--twitter", action="store_true", help="Whether you want to run for tweet. ( ``resize`` will be ( ``1300`` , ``730`` ) ).") args = parser.parse_args() video_path = args.video gif_path = args.gif resize = args.resize loop = args.loop speed = args.speed # === Load video & Get Video Information === video = cv2.VideoCapture(video_path) width = video.get(cv2.CAP_PROP_FRAME_WIDTH) height = video.get(cv2.CAP_PROP_FRAME_HEIGHT) fps = video.get(cv2.CAP_PROP_FPS) count = video.get(cv2.CAP_PROP_FRAME_COUNT) num_gif = int(1+(count-1)//speed) if gif_path is None: root, ext = os.path.splitext(video_path) gif_path = root + ".gif" gif_path = filenaming(name=gif_path) if args.twitter: resize = (1300, 730) elif resize is None: resize = (width, height) print(*pretty_3quote(f""" * Video Path : {toBLUE(video_path)} * Gif Path : {toBLUE(gif_path)} * Frame Width : {toGREEN(width )} -> {toBLUE(resize[0])} [px] * Frame Height : {toGREEN(height)} -> {toBLUE(resize[1])} [px] * Video Length : {toGREEN(f"{count/fps:.2f}")} [s] * FPS : {toGREEN(f"{fps:.2f}")} [n/s] * Frame Count : {toGREEN(count )} [n] * Speed : {toGREEN(speed)} [n/include] {toGREEN(num_gif)} frames will be included in GIF. """)) i = 0 images = [] monitor = ProgressMonitor(max_iter=count, barname="video2gif") while True: ret, img_bgr = video.read() if img_bgr is None: break elif i%speed==0: img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) img_pillow = Image.fromarray(img_rgb).resize(size=resize, resample=Image.LANCZOS).quantize(method=0) images.append(img_pillow) i+=1 monitor.report(i, frame_No=i) monitor.remove() images[0].save( fp=gif_path, format="gif", save_all=True, append_images=images[1:], loop=0 )