changeimage / app.py
Merlintxu's picture
Update app.py
2ba1410 verified
raw
history blame
4.65 kB
import gradio as gr
from PIL import Image
import os
import tempfile
def optimize_image(image):
img = Image.open(image)
original_size = os.path.getsize(image.name) / 1024 # tama帽o en KB
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
lossless_img = Image.open(lossless_output_path)
lossless_diff = original_size - lossless_size
# 2. Compresi贸n con p茅rdida (JPEG)
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
lossy_img = Image.open(lossy_output_path)
lossy_diff = original_size - lossy_size
# 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
reduced_img = Image.open(reduced_output_path)
reduced_diff = original_size - reduced_size
# 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
webp_lossy_img = Image.open(webp_lossy_output_path)
webp_lossy_diff = original_size - webp_lossy_size
# Retornar las im谩genes optimizadas, tama帽os y rutas para descarga
return [
lossless_img, f"Sin p茅rdida: {lossless_size:.2f} KB (diferencia: {-lossless_diff:.2f} KB)", lossless_output_path,
lossy_img, f"Con p茅rdida: {lossy_size:.2f} KB (diferencia: {-lossy_diff:.2f} KB)", lossy_output_path,
reduced_img, f"Reducci贸n de resoluci贸n: {reduced_size:.2f} KB (diferencia: {-reduced_diff:.2f} KB)", reduced_output_path,
webp_lossy_img, f"WebP con p茅rdida: {webp_lossy_size:.2f} KB (diferencia: {-webp_lossy_diff:.2f} KB)", webp_lossy_output_path
]
def download_image(file_path):
# Funci贸n para servir el archivo para descarga
return gr.File.update(value=file_path, visible=True)
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")
with gr.Row():
with gr.Column():
optimized_output1 = gr.Image(label="Optimizaci贸n sin p茅rdida")
optimized_size1 = gr.Text()
download_button1 = gr.Button("Descargar")
download_file1 = gr.File()
with gr.Column():
optimized_output2 = gr.Image(label="Optimizaci贸n con p茅rdida")
optimized_size2 = gr.Text()
download_button2 = gr.Button("Descargar")
download_file2 = gr.File()
with gr.Column():
optimized_output3 = gr.Image(label="Reducci贸n de resoluci贸n")
optimized_size3 = gr.Text()
download_button3 = gr.Button("Descargar")
download_file3 = gr.File()
with gr.Column():
optimized_output4 = gr.Image(label="Optimizaci贸n WebP con p茅rdida")
optimized_size4 = gr.Text()
download_button4 = gr.Button("Descargar")
download_file4 = gr.File()
# Conectar la optimizaci贸n con los outputs
optimize_button.click(
fn=optimize_image,
inputs=image_input,
outputs=[
optimized_output1, optimized_size1, download_button1,
optimized_output2, optimized_size2, download_button2,
optimized_output3, optimized_size3, download_button3,
optimized_output4, optimized_size4, download_button4
]
)
# Conectar los botones de descarga
download_button1.click(download_image, inputs=download_button1, outputs=download_file1)
download_button2.click(download_image, inputs=download_button2, outputs=download_file2)
download_button3.click(download_image, inputs=download_button3, outputs=download_file3)
download_button4.click(download_image, inputs=download_button4, outputs=download_file4)
demo.launch()