File size: 6,662 Bytes
0db0341
4dc3d40
0db0341
35a7f8f
0db0341
1ce0886
4c45b50
95fc1cb
3ef5903
 
853d6f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f3a0c08
 
92c6b51
f3a0c08
853d6f2
0db0341
 
51c8f60
35a7f8f
 
51c8f60
 
e3671eb
bbe07c9
 
1ce0886
e35bed9
3448532
2ba1410
bbe07c9
1ce0886
18d8275
e35bed9
3448532
 
bbe07c9
1ce0886
 
e35bed9
3448532
 
bbe07c9
 
18d8275
e35bed9
3448532
 
853d6f2
e3671eb
 
1ce0886
e3671eb
e35bed9
 
 
 
e3671eb
 
0db0341
853d6f2
 
 
 
e35bed9
 
 
 
853d6f2
 
 
 
 
 
 
e35bed9
 
 
 
853d6f2
 
 
 
 
 
 
e35bed9
 
 
 
853d6f2
 
 
 
 
 
 
e35bed9
 
 
 
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
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 \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
    ]

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)
            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=75, 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=75, 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
        ]
    )

    png_optimize.change(
        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
        ]
    )

    jpeg_quality.change(
        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
        ]
    )

    jpeg_resolution.change(
        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
        ]
    )

    webp_quality.change(
        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
        ]
    )

demo.launch()