import gradio as gr from PIL import Image import os import tempfile def optimize_image(image): # Leer la imagen original img = Image.open(image) # Ruta temporal para guardar las imágenes optimizadas with tempfile.TemporaryDirectory() as tmpdirname: # 1. Compresión sin pérdida lossless_output_path = os.path.join(tmpdirname, "lossless.png") img.save(lossless_output_path, format="PNG", optimize=True) lossless_size = os.path.getsize(lossless_output_path) / 1024 # tamaño en KB lossless_img = Image.open(lossless_output_path) # 2. Compresión con pérdida (reducción de calidad) lossy_output_path = os.path.join(tmpdirname, "lossy.jpg") img.save(lossy_output_path, format="JPEG", quality=50, optimize=True) lossy_size = os.path.getsize(lossy_output_path) / 1024 # tamaño en KB lossy_img = Image.open(lossy_output_path) # 3. Reducción de resolución reduced_output_path = os.path.join(tmpdirname, "reduced_resolution.jpg") reduced_img = img.resize((img.width // 2, img.height // 2), Image.LANCZOS) reduced_img.save(reduced_output_path, format="JPEG", quality=85, optimize=True) reduced_size = os.path.getsize(reduced_output_path) / 1024 # tamaño en KB reduced_img = Image.open(reduced_output_path) # 4. Compresión con WebP (con pérdida) webp_lossy_output_path = os.path.join(tmpdirname, "lossy.webp") img.save(webp_lossy_output_path, format="WEBP", quality=50, optimize=True) webp_lossy_size = os.path.getsize(webp_lossy_output_path) / 1024 # tamaño en KB webp_lossy_img = Image.open(webp_lossy_output_path) # Retornar imágenes optimizadas y sus tamaños return (lossless_img, f"Sin pérdida: {lossless_size:.2f} KB", lossy_img, f"Con pérdida: {lossy_size:.2f} KB", reduced_img, f"Reducción de resolución: {reduced_size:.2f} KB", webp_lossy_img, f"WebP con pérdida: {webp_lossy_size:.2f} KB") # Interfaz de Gradio with gr.Blocks() as demo: gr.Markdown("### Optimización de imágenes para la web") image_input = gr.File(label="Sube tu imagen", file_types=['image']) optimize_button = gr.Button("Optimizar") # Mostrar las imágenes optimizadas y sus tamaños optimized_output1 = gr.Image(label="Optimización sin pérdida") optimized_size1 = gr.Text(label="Tamaño del archivo sin pérdida") optimized_output2 = gr.Image(label="Optimización con pérdida") optimized_size2 = gr.Text(label="Tamaño del archivo con pérdida") optimized_output3 = gr.Image(label="Reducción de resolución") optimized_size3 = gr.Text(label="Tamaño del archivo con reducción de resolución") optimized_output4 = gr.Image(label="Optimización WebP con pérdida") optimized_size4 = gr.Text(label="Tamaño del archivo WebP con pérdida") optimize_button.click(fn=optimize_image, inputs=image_input, outputs=[ optimized_output1, optimized_size1, optimized_output2, optimized_size2, optimized_output3, optimized_size3, optimized_output4, optimized_size4 ]) demo.launch()