LPX55's picture
Update app.py
d94c56e verified
raw
history blame
2.62 kB
import gradio as gr
import numpy as np
from io import BytesIO
from PIL import Image
import zipfile
import cv2
def split_image_grid(image, grid_cols, grid_rows):
# Ensure image is a PIL Image
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 = BytesIO()
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 = BytesIO()
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") # Changed to "pil" for easier handling
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)