diff --git a/iz_helpers/image.py b/iz_helpers/image.py index d84901a..d8a56ca 100644 --- a/iz_helpers/image.py +++ b/iz_helpers/image.py @@ -16,8 +16,14 @@ def shrink_and_paste_on_blank(current_image, mask_width, mask_height): new_height = height - 2 * mask_height # resize and paste onto blank image - prev_image = current_image.resize((new_width, new_height)) + prev_image = current_image.resize((new_width, new_height), Image.LANCZOS) blank_image = Image.new("RGBA", (width, height), (0, 0, 0, 1)) - blank_image.paste(prev_image, (mask_width, mask_height)) + paste_box = ( + mask_width, + mask_height, + mask_width + new_width, + mask_height + new_height + ) + blank_image.paste(prev_image, paste_box) return blank_image diff --git a/iz_helpers/video.py b/iz_helpers/video.py index c3d61a3..322b69e 100644 --- a/iz_helpers/video.py +++ b/iz_helpers/video.py @@ -2,6 +2,12 @@ import numpy as np import imageio from PIL import Image +def closest_upper_divisible_by_eight(num): + if num % 8 == 0: + return num + else: + return math.ceil(num / 8) * 8 + def write_video(file_path, frames, fps, reversed=True, start_frame_dupe_amount=15, last_frame_dupe_amount=30): """ Writes frames to an mp4 video file @@ -13,9 +19,19 @@ def write_video(file_path, frames, fps, reversed=True, start_frame_dupe_amount=1 if reversed == True: frames = frames[::-1] - # Get dimensions of the first frames, all subsequent has to be same sized - for k in frames: - assert (k.size == frames[0].size,"Different frame sizes found!") + first_frame_size = frames[0].size + even_frame_size = (closest_upper_divisible_by_eight(first_frame_size[0]), closest_upper_divisible_by_eight(first_frame_size[1])) + + # Drop random garbage frames that are outsize of the requested generation size to prevent ffmpeg from throwing an error. + filtered_frames = [frame for frame in frames if frame.size == first_frame_size] + frames = filtered_frames + + # Resize all frames to the even dimensions + #resized_frames = [frame.resize(even_frame_size, Image.ANTIALIAS) for frame in frames] + #frames = resized_frames + + + #frames.pop() # Create an imageio video writer, avoid block size of 512. writer = imageio.get_writer(file_path, fps=fps, macro_block_size=None)