File size: 5,730 Bytes
0db0341
4dc3d40
0db0341
35a7f8f
3c18915
0db0341
1ce0886
4c45b50
95fc1cb
3ef5903
 
853d6f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f3a0c08
 
92c6b51
f3a0c08
853d6f2
0db0341
3c18915
 
 
 
 
51c8f60
3c18915
 
 
 
3448532
3c18915
 
 
 
 
 
3448532
3c18915
 
 
 
 
 
 
 
 
 
 
0db0341
3c18915
 
 
 
 
853d6f2
3c18915
 
 
 
 
 
 
 
 
 
 
853d6f2
3c18915
 
 
 
853d6f2
3c18915
 
 
 
 
853d6f2
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
import gradio as gr
from PIL import Image
import os
import tempfile
from transformers import pipeline

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 \n(diferencia: {-lossless_diff:.2f} KB)", lossless_output_path,
        lossy_img, f"Con p茅rdida: {lossy_size:.2f} KB \n(diferencia: {-lossy_diff:.2f} KB)", lossy_output_path,
        reduced_img, f"Reducci贸n de resoluci贸n: {reduced_size:.2f} KB \n(diferencia: {-reduced_diff:.2f} KB)", reduced_output_path,
        webp_lossy_img, f"WebP con p茅rdida: {webp_lossy_size:.2f} KB \n(diferencia: {-webp_lossy_diff:.2f} KB)", webp_lossy_output_path
    ]

# Funci贸n de ejemplo para aplicar un modelo de super-resoluci贸n
def super_res_image(image):
    esrgan = pipeline("image-super-resolution", model="microsoft/real-esrgan")
    super_res_img = esrgan(image)
    return super_res_img

with gr.Blocks() as demo:
    with gr.Tab("Optimizaci贸n Tradicional"):
        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)
                download_button1 = gr.File(label="Descargar", visible=True)
                optimized_size1 = gr.Text(value="", interactive=False, show_label=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)
                download_button2 = gr.File(label="Descargar", visible=True)
                optimized_size2 = gr.Text(value="", interactive=False, show_label=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)
                download_button3 = gr.File(label="Descargar", visible=True)
                optimized_size3 = gr.Text(value="", interactive=False, show_label=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)
                download_button4 = gr.File(label="Descargar", visible=True)
                optimized_size4 = gr.Text(value="", interactive=False, show_label=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_button1,
                optimized_output2, optimized_size2, download_button2,
                optimized_output3, optimized_size3, download_button3,
                optimized_output4, optimized_size4, download_button4
            ]
        )

    with gr.Tab("Optimizaci贸n con Modelos de Hugging Face"):
        hf_image_input = gr.File(label="Sube tu imagen para optimizaci贸n avanzada", file_types=['image'])
        super_res_output = gr.Image(label="Super-Resolution Result")
        hf_button = gr.Button("Aplicar Super-Resolution")

        hf_button.click(
            fn=super_res_image,
            inputs=hf_image_input,
            outputs=super_res_output
        )

demo.launch()