LPX55's picture
Update app.py
362a7f2 verified
raw
history blame
2.77 kB
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)