File size: 5,935 Bytes
0db0341
4dc3d40
0db0341
35a7f8f
3c18915
0db0341
1ce0886
4c45b50
95fc1cb
3ef5903
 
853d6f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f3a0c08
 
92c6b51
f3a0c08
853d6f2
0db0341
1dc6f8e
 
 
 
51c8f60
3c18915
 
 
 
3448532
3c18915
 
 
 
 
 
3448532
3c18915
 
 
 
 
 
 
 
 
 
 
0db0341
3c18915
 
 
 
 
853d6f2
3c18915
 
 
 
 
 
 
 
 
 
 
853d6f2
3c18915
 
1dc6f8e
 
 
 
 
 
 
853d6f2
3c18915
1dc6f8e
 
 
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
117
118
119
120
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 para aplicar un modelo seleccionado desde Hugging Face
def apply_model(image, model_name):
    model_pipeline = pipeline("image-super-resolution", model=model_name)
    return model_pipeline(image)

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'])
        model_selector = gr.Dropdown(
            label="Selecciona un modelo",
            choices=["xinntao/Real-ESRGAN", "google/ddpm-cifar10-32", "facebook/ddpm"],  # A帽ade los modelos disponibles
            value="xinntao/Real-ESRGAN"
        )
        hf_output = gr.Image(label="Resultado")
        hf_button = gr.Button("Aplicar Modelo")

        hf_button.click(
            fn=apply_model,
            inputs=[hf_image_input, model_selector],
            outputs=hf_output
        )

demo.launch()