diff --git a/video_to_gif.py b/video_to_gif.py index 3660699..dd57a64 100644 --- a/video_to_gif.py +++ b/video_to_gif.py @@ -19,11 +19,23 @@ def get_args() -> Dict[str, Any]: help='Width of the GIF in pixels, respecting aspect ratio') parser.add_argument('-r', '--framerate', type=str, default='12', help='Framerate of GIF') + parser.add_argument('-s', '--scaler', type=str, choices=get_scaling_algorithms(), + default='lanczos', help='Scaling algorithm to use') parser.add_argument('-t', '--tag', type=str, default=get_tag(), help='Optional tag included in file name') return vars(parser.parse_args()) +def get_scaling_algorithms() -> List[str]: + return ['fast_bilinear', 'bilinear', 'bicubic', 'experimental', 'neighbor', + 'area', 'bicublin', 'gauss', 'sinc', 'lanczos', 'spline'] + + +# TODO: Figure out how to specify both scaling and dithering algorithms. +def get_dithering_algorithms() -> List[str]: + return ['none', 'auto', 'bayer', 'ed', 'a_dither', 'x_dither'] + + def get_tag() -> str: return ''.join(random.choices(string.ascii_uppercase + string.digits, k=5)) @@ -41,13 +53,15 @@ def generate_gif_files(inputs: List[str], args: Dict[str, Any]) -> Dict[str, str tag = args['tag'] width = args['width'] framerate = args['framerate'] + scaler = args['scaler'] output_map = {} for input in inputs: file_name = f"{Path(input).stem}_{tag}.gif" full_path = f"{Path(input).parent}/{file_name}" call_ffmpeg(f"-i {input} -f gif -r {framerate} -filter_complex scale={ \ - width}:-1:flags=lanczos,split[v1][v2];[v1]palettegen[plt];[v2][plt]paletteuse {full_path}") + width}:-1:flags={scaler},split[v1][v2];[v1]palettegen[plt];[v2][plt]paletteuse { \ + full_path}") output_map[input] = full_path return output_map