File size: 6,514 Bytes
0db0341
4dc3d40
0db0341
35a7f8f
a329012
3c18915
0db0341
a329012
 
 
 
 
 
 
 
 
 
 
 
1ce0886
a329012
 
 
 
 
 
9ad37b0
 
a329012
95fc1cb
3ef5903
853d6f2
 
 
a329012
853d6f2
a329012
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
853d6f2
a329012
 
 
 
 
 
853d6f2
9ad37b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0db0341
1dc6f8e
 
 
 
51c8f60
3c18915
 
746a0ed
3c18915
3448532
3c18915
 
 
 
 
 
3448532
3c18915
 
 
 
 
 
 
 
 
 
 
0db0341
3c18915
 
 
 
 
853d6f2
3c18915
 
 
 
 
 
 
 
 
 
 
853d6f2
3c18915
746a0ed
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
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
import gradio as gr
from PIL import Image
import os
import tempfile
import pyheif
from transformers import pipeline

def open_heic_image(image_path):
    heif_file = pyheif.read(image_path)
    img = Image.frombytes(
        heif_file.mode, 
        heif_file.size, 
        heif_file.data,
        "raw",
        heif_file.mode,
        heif_file.stride,
    )
    return img

def optimize_image(image, png_optimize, jpeg_quality, jpeg_resolution, webp_quality):
    # Manejar archivos HEIC
    if image.name.lower().endswith(".heic"):
        img = open_heic_image(image.name)
    else:
        img = Image.open(image)

    # Convertir la imagen a RGB si est谩 en RGBA o en un modo no soportado por JPEG
    if img.mode not in ['RGB', 'L']:
        img = img.convert('RGB')
    
    original_size = os.path.getsize(image.name) / 1024  # tama帽o en KB
    output_dir = "/tmp/optimized_images"
    os.makedirs(output_dir, exist_ok=True)
    
    results = []
    
    # Optimizaci贸n para PNG
    if png_optimize:
        lossless_output_path = os.path.join(output_dir, "lossless.png")
        img.save(lossless_output_path, format="PNG", optimize=True)
        lossless_size = os.path.getsize(lossless_output_path) / 1024
        results.append(("PNG", lossless_output_path, lossless_size, original_size))

    # Optimizaci贸n para JPEG
    if jpeg_quality != 50:
        lossy_output_path = os.path.join(output_dir, "lossy.jpg")
        img.save(lossy_output_path, format="JPEG", quality=jpeg_quality, optimize=True)
        lossy_size = os.path.getsize(lossy_output_path) / 1024
        results.append(("JPEG", lossy_output_path, lossy_size, original_size))

    # Reducci贸n de resoluci贸n (JPEG)
    if jpeg_resolution != 50:
        reduced_output_path = os.path.join(output_dir, "reduced_resolution.jpg")
        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
        results.append(("JPEG (resoluci贸n reducida)", reduced_output_path, reduced_size, original_size))

    # Optimizaci贸n para WebP
    if webp_quality != 50:
        webp_lossy_output_path = os.path.join(output_dir, "lossy.webp")
        img.save(webp_lossy_output_path, format="WEBP", quality=webp_quality, optimize=True)
        webp_lossy_size = os.path.getsize(webp_lossy_output_path) / 1024
        results.append(("WebP", webp_lossy_output_path, webp_lossy_size, original_size))
    
    # Si alguna de las optimizaciones no se ejecut贸, devolver valores por defecto para completar los 12 elementos
    while len(results) < 4:
        results.append(("", "", 0, original_size))
    
    # Preparar las salidas esperadas
    outputs = []
    for format_name, path, size, original_size in results:
        if format_name and path:
            img = Image.open(path)
            percent_reduction = 100 * (original_size - size) / original_size
            outputs.extend([img, f"{format_name}: {size:.2f} KB\n(diferencia: {-percent_reduction:.2f} KB)", path])
        else:
            outputs.extend([None, "", None])
    
    return outputs

# 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', '.heic'])
        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', '.heic'])
        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()