changeimage / app.py
Merlintxu's picture
Update app.py
4dc3d40 verified
raw
history blame
3.25 kB
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()