Spaces:
Running
Running
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()
|