A / app.py
TIMBOVILL's picture
Update app.py
d30e079 verified
import os
import zipfile
import tempfile
from PIL import Image
import gradio as gr
import shutil
def resize_icons(zip_file_path, width, height):
import uuid
valid_extensions = (".png", ".jpg", ".jpeg", ".bmp", ".gif", ".webp")
# Use temporary working directory for processing
with tempfile.TemporaryDirectory() as tmpdir:
# Extract uploaded ZIP
extract_dir = os.path.join(tmpdir, "extracted")
os.makedirs(extract_dir, exist_ok=True)
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
zip_ref.extractall(extract_dir)
# Prepare output folder for resized images
output_dir = os.path.join(tmpdir, "resized")
os.makedirs(output_dir, exist_ok=True)
files_processed = 0
# Walk and resize images
for root, _, files in os.walk(extract_dir):
if "__MACOSX" in root:
continue
for file in files:
if not file.lower().endswith(valid_extensions):
continue
if file.startswith("._"):
continue # Skip macOS metadata files
file_path = os.path.join(root, file)
try:
img = Image.open(file_path)
img = img.convert("RGBA")
img_resized = img.resize((int(width), int(height)), Image.LANCZOS)
# Preserve folder structure
rel_path = os.path.relpath(file_path, extract_dir)
output_path = os.path.join(output_dir, rel_path)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
img_resized.save(output_path)
files_processed += 1
except Exception as e:
print(f"Skipping {file_path}: {e}")
if files_processed == 0:
raise FileNotFoundError("No valid image files found to resize.")
# Write ZIP to persistent path
unique_id = uuid.uuid4().hex
final_zip_path = f"/tmp/resized_icons_{unique_id}.zip"
with zipfile.ZipFile(final_zip_path, 'w') as zipf:
for root, _, files in os.walk(output_dir):
for file in files:
full_path = os.path.join(root, file)
arcname = os.path.relpath(full_path, output_dir)
zipf.write(full_path, arcname)
return final_zip_path
# Gradio UI
demo = gr.Interface(
fn=resize_icons,
inputs=[
gr.File(label="Upload ZIP of Icons", file_types=[".zip"]),
gr.Number(label="Width", value=64),
gr.Number(label="Height", value=64)
],
outputs=gr.File(label="Download Resized ZIP"),
title="📦 Icon Resizer",
description="Upload a ZIP of images (icons). Set width and height. Download resized icons as a ZIP."
)
if __name__ == "__main__":
demo.launch()