changeimage / app.py
Merlintxu's picture
Update app.py
51c8f60 verified
raw
history blame
2.59 kB
import gradio as gr
from PIL import Image, ImageOps
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.ANTIALIAS)
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)
# 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")
# 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")
optimize_button.click(fn=optimize_image, inputs=image_input, outputs=[optimized_output1, optimized_size1, optimized_output2, optimized_size2, optimized_output3, optimized_size3])
demo.launch()