File size: 6,966 Bytes
0db0341
4dc3d40
0db0341
35a7f8f
a329012
5c60085
0902d61
0db0341
a329012
 
 
 
 
 
 
 
 
 
 
 
0902d61
 
5c60085
 
0902d61
 
a329012
0902d61
a329012
9ad37b0
a329012
95fc1cb
0902d61
 
853d6f2
0902d61
5c60085
a329012
5c60085
a329012
0902d61
a329012
5c60085
2e03b03
0902d61
a329012
5c60085
2e03b03
 
 
0902d61
853d6f2
5c60085
2e03b03
0902d61
5c60085
0902d61
 
 
 
 
 
 
 
0db0341
0902d61
 
 
 
 
 
 
 
 
 
 
 
 
51c8f60
3c18915
0902d61
 
 
 
 
 
 
 
3c18915
746a0ed
3c18915
3448532
3c18915
 
 
 
 
 
3448532
3c18915
 
0902d61
3c18915
 
 
 
 
0902d61
3c18915
 
0db0341
3c18915
 
0902d61
3c18915
 
853d6f2
3c18915
0902d61
3c18915
 
 
 
 
 
 
 
853d6f2
0902d61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
148
149
import gradio as gr
from PIL import Image
import os
import tempfile
import pyheif
import ntpath
import shutil

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_single_image(image_path, png_optimize, jpeg_quality, jpeg_resolution, webp_quality):
    original_filename = ntpath.basename(image_path)
    base_name, ext = os.path.splitext(original_filename)
    
    if image_path.lower().endswith(".heic"):
        img = open_heic_image(image_path)
    else:
        img = Image.open(image_path)

    if img.mode not in ['RGB', 'L']:
        img = img.convert('RGB')
    
    original_size = os.path.getsize(image_path) / 1024  # tama帽o en KB
    output_dir = tempfile.mkdtemp()  # Crear un directorio temporal para las im谩genes optimizadas
    
    optimized_images = []

    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)
        optimized_images.append(lossless_output_path)

    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)
    optimized_images.append(lossy_output_path)

    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)
    optimized_images.append(reduced_output_path)

    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)
    optimized_images.append(webp_lossy_output_path)

    return optimized_images

def optimize_zip_images(zip_file, png_optimize, jpeg_quality, jpeg_resolution, webp_quality):
    with tempfile.TemporaryDirectory() as tmp_dir:
        shutil.unpack_archive(zip_file.name, tmp_dir)
        output_dir = tempfile.mkdtemp()

        optimized_files = []

        for root, _, files in os.walk(tmp_dir):
            for file in files:
                file_path = os.path.join(root, file)
                optimized_images = optimize_single_image(file_path, png_optimize, jpeg_quality, jpeg_resolution, webp_quality)
                for optimized_image in optimized_images:
                    output_path = os.path.join(output_dir, ntpath.basename(optimized_image))
                    shutil.move(optimized_image, output_path)
                    optimized_files.append(output_path)

        zip_output_path = os.path.join(output_dir, "optimized_images.zip")
        shutil.make_archive(zip_output_path.replace(".zip", ""), 'zip', output_dir)

        return zip_output_path, optimized_files

with gr.Blocks() as demo:
    gr.Markdown("""
    # Optimizaci贸n de Im谩genes para la Web
    Esta aplicaci贸n te permite optimizar im谩genes individuales o m煤ltiples im谩genes a trav茅s de un archivo ZIP.
    
    - **Pesta帽a "Optimizaci贸n Tradicional"**: Sube una imagen individual para optimizaci贸n y descarga.
    - **Pesta帽a "Optimizaci贸n por Lote"**: Elige los par谩metros de optimizaci贸n, sube un archivo ZIP con m煤ltiples im谩genes y descarga todas las im谩genes optimizadas.
    """)

    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)

        optimize_button.click(
            fn=optimize_single_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 por Lote"):
        with gr.Row():
            png_optimize_batch = gr.Checkbox(label="Optimizar PNG", value=True)
            jpeg_quality_batch = gr.Slider(label="Calidad JPEG", minimum=10, maximum=100, value=50, step=1)
            jpeg_resolution_batch = gr.Slider(label="Resoluci贸n JPEG (%)", minimum=10, maximum=100, value=50, step=1)
            webp_quality_batch = gr.Slider(label="Calidad WebP", minimum=10, maximum=100, value=50, step=1)
        
        zip_input = gr.File(label="Sube tu archivo ZIP con im谩genes", file_types=['.zip'])
        optimize_batch_button = gr.Button("Optimizar Im谩genes en ZIP")
        
        batch_output_zip = gr.File(label="Descargar ZIP de im谩genes optimizadas", visible=True)
        batch_output_files = gr.File(label="Descargar im谩genes individuales", visible=True, multiple=True)

        optimize_batch_button.click(
            fn=optimize_zip_images,
            inputs=[zip_input, png_optimize_batch, jpeg_quality_batch, jpeg_resolution_batch, webp_quality_batch],
            outputs=[batch_output_zip, batch_output_files]
        )

demo.launch()