import gradio as gr import numpy as np from io import BytesIO from PIL import Image import zipfile import os class NamedBytesIO(BytesIO): def __init__(self, *args, name="output.zip", **kwargs): super(NamedBytesIO, self).__init__(*args, **kwargs) self.name = name def split_image_grid(image, grid_cols, grid_rows): if isinstance(image, np.ndarray): image = Image.fromarray(image) width, height = image.width, image.height cell_width = width // grid_cols cell_height = height // grid_rows frames = [] for i in range(grid_rows): for j in range(grid_cols): left = j * cell_width upper = i * cell_height right = left + cell_width lower = upper + cell_height frame = image.crop((left, upper, right, lower)) frames.append(np.array(frame)) return frames def zip_images(images): zip_buffer = NamedBytesIO(name="output.zip") with zipfile.ZipFile(zip_buffer, 'w') as zipf: for idx, img in enumerate(images): img_buffer = BytesIO() img = Image.fromarray(img) img.save(img_buffer, format='PNG') img_buffer.seek(0) zipf.writestr(f'image_{idx}.png', img_buffer.getvalue()) zip_buffer.seek(0) return zip_buffer def create_gif(images): gif_buffer = NamedBytesIO(name="output.gif") images_pil = [Image.fromarray(img) for img in images] images_pil[0].save(gif_buffer, format='GIF', save_all=True, append_images=images_pil[1:], duration=100, loop=0) gif_buffer.seek(0) return gif_buffer def process_image(image, grid_cols_input, grid_rows_input): frames = split_image_grid(image, grid_cols_input, grid_rows_input) zip_file = zip_images(frames) return zip_file def process_image_to_gif(image, grid_cols_input, grid_rows_input): frames = split_image_grid(image, grid_cols_input, grid_rows_input) gif_file = create_gif(frames) return gif_file with gr.Blocks() as demo: with gr.Row(): image_input = gr.Image(label="Input Image", type="pil") grid_cols_input = gr.Slider(1, 10, value=2, step=1, label="Grid Columns") grid_rows_input = gr.Slider(1, 10, value=2, step=1, label="Grid Rows") with gr.Row(): zip_button = gr.Button("Create Zip File") gif_button = gr.Button("Create GIF") with gr.Row(): zip_output = gr.File(label="Download Zip File") gif_output = gr.File(label="Download GIF") zip_button.click(process_image, inputs=[image_input, grid_cols_input, grid_rows_input], outputs=zip_output) gif_button.click(process_image_to_gif, inputs=[image_input, grid_cols_input, grid_rows_input], outputs=gif_output) demo.launch(show_error=True)