|
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) |