Spaces:
Running
Running
File size: 7,207 Bytes
0db0341 4dc3d40 0db0341 35a7f8f 0db0341 1ce0886 4c45b50 95fc1cb 3ef5903 853d6f2 0db0341 2ba1410 1fa88c0 2ba1410 0db0341 51c8f60 35a7f8f 51c8f60 e3671eb bbe07c9 1ce0886 1fa88c0 bbe07c9 1fa88c0 2ba1410 bbe07c9 1ce0886 1fa88c0 bbe07c9 1fa88c0 95fc1cb bbe07c9 1ce0886 1fa88c0 bbe07c9 1fa88c0 35a7f8f bbe07c9 1ce0886 1fa88c0 bbe07c9 1fa88c0 4dc3d40 853d6f2 e3671eb 1ce0886 e3671eb 1fa88c0 e3671eb 0db0341 853d6f2 1fa88c0 bbe07c9 0db0341 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
import gradio as gr
from PIL import Image
import os
import tempfile
def optimize_image(image, png_optimize, jpeg_quality, jpeg_resolution, webp_quality):
img = Image.open(image)
original_size = os.path.getsize(image.name) / 1024 # tama帽o en KB
# Crear un directorio seguro para almacenar las im谩genes optimizadas
output_dir = "/tmp/optimized_images"
os.makedirs(output_dir, exist_ok=True)
# Generar archivos temporales en un directorio seguro
lossless_output_path = os.path.join(output_dir, "lossless.png")
lossy_output_path = os.path.join(output_dir, "lossy.jpg")
reduced_output_path = os.path.join(output_dir, "reduced_resolution.jpg")
webp_lossy_output_path = os.path.join(output_dir, "lossy.webp")
# 1. Compresi贸n sin p茅rdida (PNG)
img.save(lossless_output_path, format="PNG", optimize=png_optimize)
lossless_size = os.path.getsize(lossless_output_path) / 1024
lossless_diff = original_size - lossless_size
lossless_img = Image.open(lossless_output_path)
# 2. Compresi贸n con p茅rdida (JPEG)
img.save(lossy_output_path, format="JPEG", quality=jpeg_quality, optimize=True)
lossy_size = os.path.getsize(lossy_output_path) / 1024
lossy_diff = original_size - lossy_size
lossy_img = Image.open(lossy_output_path)
# 3. Reducci贸n de resoluci贸n (JPEG)
new_resolution = (img.width * jpeg_resolution // 100, img.height * jpeg_resolution // 100)
reduced_img = img.resize(new_resolution, Image.LANCZOS)
reduced_img.save(reduced_output_path, format="JPEG", quality=jpeg_quality, optimize=True)
reduced_size = os.path.getsize(reduced_output_path) / 1024
reduced_diff = original_size - reduced_size
reduced_img = Image.open(reduced_output_path)
# 4. Compresi贸n con WebP (con p茅rdida)
img.save(webp_lossy_output_path, format="WEBP", quality=webp_quality, optimize=True)
webp_lossy_size = os.path.getsize(webp_lossy_output_path) / 1024
webp_lossy_diff = original_size - webp_lossy_size
webp_lossy_img = Image.open(webp_lossy_output_path)
# 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):
return gr.File.update(value=file_path, label="Descargar", 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")
png_optimize = gr.Checkbox(label="Optimizar PNG", value=True)
optimized_size1 = gr.Text(value="", interactive=False, show_label=False)
download_button1 = gr.Button("Descargar")
download_file1 = gr.File(visible=False)
with gr.Column():
optimized_output2 = gr.Image(label="Optimizaci贸n con p茅rdida (JPEG)")
jpeg_quality = gr.Slider(label="Calidad JPEG", minimum=10, maximum=100, value=50, step=1)
optimized_size2 = gr.Text(value="", interactive=False, show_label=False)
download_button2 = gr.Button("Descargar")
download_file2 = gr.File(visible=False)
with gr.Column():
optimized_output3 = gr.Image(label="Reducci贸n de resoluci贸n (JPEG)")
jpeg_resolution = gr.Slider(label="Resoluci贸n JPEG (%)", minimum=10, maximum=100, value=50, step=1)
optimized_size3 = gr.Text(value="", interactive=False, show_label=False)
download_button3 = gr.Button("Descargar")
download_file3 = gr.File(visible=False)
with gr.Column():
optimized_output4 = gr.Image(label="Optimizaci贸n WebP con p茅rdida")
webp_quality = gr.Slider(label="Calidad WebP", minimum=10, maximum=100, value=50, step=1)
optimized_size4 = gr.Text(value="", interactive=False, show_label=False)
download_button4 = gr.Button("Descargar")
download_file4 = gr.File(visible=False)
# Conectar cada control a la funci贸n de optimizaci贸n
optimize_button.click(
fn=optimize_image,
inputs=[image_input, png_optimize, jpeg_quality, jpeg_resolution, webp_quality],
outputs=[
optimized_output1, optimized_size1, download_file1,
optimized_output2, optimized_size2, download_file2,
optimized_output3, optimized_size3, download_file3,
optimized_output4, optimized_size4, download_file4
]
)
png_optimize.change(
fn=optimize_image,
inputs=[image_input, png_optimize, jpeg_quality, jpeg_resolution, webp_quality],
outputs=[
optimized_output1, optimized_size1, download_file1,
optimized_output2, optimized_size2, download_file2,
optimized_output3, optimized_size3, download_file3,
optimized_output4, optimized_size4, download_file4
]
)
jpeg_quality.change(
fn=optimize_image,
inputs=[image_input, png_optimize, jpeg_quality, jpeg_resolution, webp_quality],
outputs=[
optimized_output1, optimized_size1, download_file1,
optimized_output2, optimized_size2, download_file2,
optimized_output3, optimized_size3, download_file3,
optimized_output4, optimized_size4, download_file4
]
)
jpeg_resolution.change(
fn=optimize_image,
inputs=[image_input, png_optimize, jpeg_quality, jpeg_resolution, webp_quality],
outputs=[
optimized_output1, optimized_size1, download_file1,
optimized_output2, optimized_size2, download_file2,
optimized_output3, optimized_size3, download_file3,
optimized_output4, optimized_size4, download_file4
]
)
webp_quality.change(
fn=optimize_image,
inputs=[image_input, png_optimize, jpeg_quality, jpeg_resolution, webp_quality],
outputs=[
optimized_output1, optimized_size1, download_file1,
optimized_output2, optimized_size2, download_file2,
optimized_output3, optimized_size3, download_file3,
optimized_output4, optimized_size4, download_file4
]
)
download_button1.click(download_image, inputs=download_file1, outputs=download_file1)
download_button2.click(download_image, inputs=download_file2, outputs=download_file2)
download_button3.click(download_image, inputs=download_file3, outputs=download_file3)
download_button4.click(download_image, inputs=download_file4, outputs=download_file4)
demo.launch()
|