|
import gradio as gr |
|
import numpy as np |
|
import zipfile |
|
from io import BytesIO |
|
from PIL import Image |
|
|
|
def split_image_grid(image, grid_cols, grid_rows): |
|
|
|
img = np.array(image) |
|
width, height = img.shape[1], img.shape[0] |
|
grid_width = grid_cols |
|
grid_height = grid_rows |
|
|
|
cell_width = width // grid_width |
|
cell_height = height // grid_height |
|
|
|
|
|
frames = [] |
|
for i in range(grid_height): |
|
for j in range(grid_width): |
|
left = j * cell_width |
|
upper = i * cell_height |
|
right = left + cell_width |
|
lower = upper + cell_height |
|
frame = img[upper:lower, left:right] |
|
frames.append(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 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 |
|
|
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
image_input = gr.Image(label="Input Image", type="filepath") |
|
grid_cols_input = gr.Slider(1, 10, value=2, step=1, label="Grid Cols") |
|
grid_rows_input = gr.Slider(1, 10, value=2, step=1, label="Grid Rows") |
|
zip_output = gr.File(label="Output Zip File") |
|
process_button = gr.Button("Process Image") |
|
|
|
process_button.click(process_image, inputs=[image_input, grid_cols_input, grid_rows_input], outputs=zip_output) |
|
|
|
demo.launch(show_error=True) |