File size: 5,989 Bytes
0db0341
4dc3d40
0db0341
35a7f8f
a329012
5c60085
0db0341
a329012
 
 
 
 
 
 
 
 
 
 
 
1ce0886
5c60085
 
 
 
a329012
 
 
 
 
 
9ad37b0
 
a329012
95fc1cb
3ef5903
853d6f2
 
 
5c60085
a329012
5c60085
a329012
 
5c60085
a329012
 
5c60085
 
a329012
 
5c60085
2e03b03
 
5c60085
 
a329012
 
5c60085
2e03b03
 
 
 
5c60085
 
853d6f2
a329012
5c60085
2e03b03
 
5c60085
 
 
 
 
 
9ad37b0
5c60085
9ad37b0
5c60085
 
0db0341
5c60085
51c8f60
3c18915
 
746a0ed
3c18915
3448532
3c18915
 
 
 
 
 
3448532
3c18915
 
5c60085
3c18915
 
 
 
 
5c60085
3c18915
 
0db0341
3c18915
 
5c60085
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
117
118
119
120
121
122
123
124
125
126
127
import gradio as gr
from PIL import Image
import os
import tempfile
import pyheif
import ntpath

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):
    # Obtener el nombre del archivo original sin la extensi贸n
    original_filename = ntpath.basename(image.name)
    base_name, ext = os.path.splitext(original_filename)
    
    # 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)
    
    # Lista para almacenar los resultados
    results = []

    # Optimizaci贸n para PNG
    if png_optimize:
        lossless_output_path = os.path.join(output_dir, f"{base_name}-lossless.png")
        img.save(lossless_output_path, format="PNG", optimize=True)
        lossless_size = os.path.getsize(lossless_output_path) / 1024
        percent_reduction = 100 * (original_size - lossless_size) / original_size
        results.append((Image.open(lossless_output_path), f"PNG: {lossless_size:.2f} KB (diferencia: {-percent_reduction:.2f} KB)", lossless_output_path))

    # Optimizaci贸n para JPEG
    lossy_output_path = os.path.join(output_dir, f"{base_name}-lossy.jpg")
    img.save(lossy_output_path, format="JPEG", quality=jpeg_quality, optimize=True)
    lossy_size = os.path.getsize(lossy_output_path) / 1024
    percent_reduction = 100 * (original_size - lossy_size) / original_size
    results.append((Image.open(lossy_output_path), f"JPEG: {lossy_size:.2f} KB (diferencia: {-percent_reduction:.2f} KB)", lossy_output_path))

    # Reducci贸n de resoluci贸n (JPEG)
    reduced_output_path = os.path.join(output_dir, f"{base_name}-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
    percent_reduction = 100 * (original_size - reduced_size) / original_size
    results.append((Image.open(reduced_output_path), f"JPEG (resoluci贸n reducida): {reduced_size:.2f} KB (diferencia: {-percent_reduction:.2f} KB)", reduced_output_path))

    # Optimizaci贸n para WebP
    webp_lossy_output_path = os.path.join(output_dir, f"{base_name}-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
    percent_reduction = 100 * (original_size - webp_lossy_size) / original_size
    results.append((Image.open(webp_lossy_output_path), f"WebP: {webp_lossy_size:.2f} KB (diferencia: {-percent_reduction:.2f} KB)", webp_lossy_output_path))

    # Asegurarse de que todos los resultados est谩n presentes (4 entradas)
    while len(results) < 4:
        results.append((None, "", None))
    
    # Dividir los resultados en im谩genes, textos y rutas para descarga
    outputs = []
    for result in results:
        outputs.extend(result)

    return outputs

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

demo.launch()