Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from PIL import Image | |
| import tempfile | |
| def reverse(input_path, frames_per_second): | |
| # Open the GIF file | |
| gif = Image.open(input_path) | |
| # Get the number of frames in the GIF | |
| num_frames = gif.n_frames | |
| # Create a list to hold the reversed frames | |
| reversed_frames = [] | |
| # Iterate through the frames in reverse order | |
| for frame_number in range(num_frames, 0, -1): | |
| gif.seek(frame_number - 1) | |
| frame = gif.copy() | |
| reversed_frames.append(frame) | |
| # Interesting blur effect on gifs with transparent background | |
| if 'duration' not in gif.info: | |
| # Default is 8 frames per second from AnimatedDiff | |
| duration = frames_per_second * num_frames | |
| gif.info['duration'] = duration | |
| # Save the reversed frames as a new GIF | |
| with tempfile.NamedTemporaryFile(suffix=".gif", delete=False) as temp_file: | |
| temp_filename = temp_file.name | |
| reversed_frames[0].save(temp_filename, save_all=True, append_images=reversed_frames[1:], | |
| duration=gif.info['duration'], loop=0) | |
| return temp_filename | |
| def reverse_gifs(input_paths, frames_per_second): | |
| if input_paths is None: | |
| return None, None | |
| input_paths = [f.name for f in input_paths] | |
| temp_filenames = [] | |
| for input_path in input_paths: | |
| temp_filenames.append(reverse(input_path, frames_per_second)) | |
| return input_paths, temp_filenames | |
| with gr.Blocks(theme='gstaff/sketch') as demo: | |
| gr.Markdown(value='# GIF Reversing Tool') | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown('## Load animated gifs to reverse') | |
| image_in = gr.Files(label="Input Gif Files", type='file', file_types=['.gif']) | |
| frame_rate = gr.Number(label="Frames per Second to use (if not in gif metadata)", value=8, minimum=1, | |
| maximum=360, step=1, interactive=True) | |
| image_display = gr.Gallery(label="Input Images", interactive=False) | |
| with gr.Column(scale=1): | |
| gr.Markdown('## View the reversed gif') | |
| image_out = gr.Gallery(label="Reversed Gif Images") | |
| clear_button = gr.ClearButton(components=[image_in]) | |
| image_in.change(reverse_gifs, [image_in, frame_rate], [image_display, image_out]) | |
| gr.Examples(examples=[[['./example.gif'], 8]], | |
| inputs=[image_in, frame_rate], outputs=[image_display, image_out], fn=reverse_gifs, cache_examples=True) | |
| with gr.Accordion('Developer Notes:', open=False): | |
| gr.Markdown('This gif reverser is a simple utility I made for myself.\n\n' | |
| 'The default of 8 frames per second works for the default settings of [AnimateDiff](https://github.com/continue-revolution/sd-webui-animatediff).\n\n' | |
| 'Future enhancements could be to auto-determine the framerate when otherwise not available in the gif metadata.') | |
| if __name__ == '__main__': | |
| demo.launch() | |