Oh MyUtils

Compresor de Imágenes - Comprimir PNG, JPG y WebP Online

Comprime imágenes manteniendo la calidad. Reduce tamaño de PNG, JPG y WebP con comparación antes/después — sin subir archivos, 100% en navegador.

Preguntas frecuentes

Que es la compresion de imagenes y por que la necesito?

La compresion de imagenes reduce el tamano de archivo de las imagenes eliminando datos innecesarios o aplicando algoritmos matematicos que codifican la imagen de manera mas eficiente. Para el desarrollo web, las imagenes comprimidas resultan en tiempos de carga mas rapidos, menor consumo de ancho de banda, mejores puntuaciones de Core Web Vitals y mejores rankings SEO. Una foto DSLR tipica de 5MB se puede comprimir a menos de 500KB con una perdida minima de calidad visual.

Como uso esta herramienta de compresion de imagenes?

1. Arrastra y suelta tus imagenes en el area de carga (o haz clic para buscar archivos). 2. Ajusta el control deslizante de calidad (el valor predeterminado es 80%, un buen equilibrio). 3. Opcionalmente establece el ancho/alto maximo para redimensionar. 4. Haz clic en "Comprimir" en imagenes individuales o "Comprimir todo" para procesamiento por lotes. 5. Vista previa de la comparacion antes/despues en la pestana Comparar. 6. Descarga imagenes individuales o usa "Descargar todo (ZIP)" para un archivo ZIP.

Estan seguros mis datos de imagen? Se suben las imagenes a un servidor?

Tus imagenes estan 100% seguras y nunca salen de tu navegador. Toda la compresion se realiza del lado del cliente usando la API Canvas de HTML5 y OffscreenCanvas. Ningun dato de imagen se transmite a ningun servidor, lo que hace que esta herramienta sea completamente privada. Incluso puedes usarla sin conexion despues de que se cargue la pagina.

Cual es la diferencia entre compresion con perdida y sin perdida?

La compresion con perdida (JPEG, WebP) elimina permanentemente algunos datos de la imagen para lograr tamanos de archivo mas pequenos. Con configuraciones de calidad del 70-90%, la diferencia visual es tipicamente imperceptible. La compresion sin perdida (PNG) preserva todos los datos de la imagen exactamente, resultando en archivos mas grandes pero con calidad perfecta. JPEG y WebP usan compresion con perdida por defecto; PNG siempre es sin perdida al usar la API Canvas.

Que formato de imagen debo usar: JPEG, PNG o WebP?

JPEG es mejor para fotografias e imagenes complejas con muchos colores y gradientes (no soporta transparencia). PNG es mejor para graficos, iconos, capturas de pantalla e imagenes con texto o bordes nitidos (soporta transparencia, tamanos de archivo mayores). WebP es un formato moderno que generalmente es 25-35% mas pequeno que JPEG con calidad equivalente, soporta compresion con y sin perdida y transparencia, y es recomendado para uso web con soporte de navegadores global del 95%+.

Por que mi archivo PNG se hizo mas grande despues de la compresion?

La API Canvas produce salida PNG sin perdida, que puede diferir de codificadores PNG optimizados (como OptiPNG o pngquant). Si el PNG original ya estaba bien optimizado, la recodificacion a traves de Canvas puede producir un archivo ligeramente mas grande. Para reducir el tamano del PNG, intenta redimensionar la imagen a dimensiones mas pequenas.

Cual es el tamano maximo de archivo y resolucion soportados?

Esta herramienta soporta imagenes de hasta 50MB por archivo y resoluciones de hasta 16384 x 16384 pixeles (el limite de la API Canvas en la mayoria de los navegadores). Para imagenes de muy alta resolucion, considera usar la opcion de redimensionar para reducir las dimensiones primero, lo que tambien acelerara la compresion. En dispositivos moviles, la resolucion maxima puede ser menor debido a restricciones de memoria.

Puedo comprimir multiples imagenes a la vez?

Si, el procesamiento por lotes soporta hasta 20 imagenes simultaneamente. Puedes establecer un nivel de calidad global para todas las imagenes. Despues de la compresion, usa "Descargar todo (ZIP)" para descargar todas las imagenes comprimidas en un solo archivo ZIP.

Ejemplos de codigo

// Client-side image compression using Canvas API
async function compressImage(file, quality = 0.8) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    const url = URL.createObjectURL(file);

    img.onload = () => {
      URL.revokeObjectURL(url);

      const canvas = document.createElement('canvas');
      canvas.width = img.width;
      canvas.height = img.height;

      const ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0);

      // Determine output type (use WebP if supported, fallback to JPEG)
      const outputType = file.type === 'image/png' ? 'image/png' : 'image/webp';

      canvas.toBlob(
        (blob) => {
          if (!blob) {
            reject(new Error('Compression failed'));
            return;
          }
          resolve({
            blob,
            originalSize: file.size,
            compressedSize: blob.size,
            reductionPercent: Math.round((1 - blob.size / file.size) * 100),
          });
        },
        outputType,
        outputType === 'image/png' ? undefined : quality
      );
    };

    img.onerror = () => {
      URL.revokeObjectURL(url);
      reject(new Error('Failed to load image'));
    };

    img.src = url;
  });
}

// Compress with resize
async function compressAndResize(file, maxWidth, maxHeight, quality = 0.8) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    const url = URL.createObjectURL(file);

    img.onload = () => {
      URL.revokeObjectURL(url);

      let { width, height } = img;

      // Calculate new dimensions maintaining aspect ratio
      if (maxWidth && width > maxWidth) {
        height = Math.round((height * maxWidth) / width);
        width = maxWidth;
      }
      if (maxHeight && height > maxHeight) {
        width = Math.round((width * maxHeight) / height);
        height = maxHeight;
      }

      const canvas = document.createElement('canvas');
      canvas.width = width;
      canvas.height = height;

      const ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0, width, height);

      canvas.toBlob(
        (blob) => {
          if (!blob) {
            reject(new Error('Compression failed'));
            return;
          }
          resolve({
            blob,
            originalSize: file.size,
            compressedSize: blob.size,
            width,
            height,
            reductionPercent: Math.round((1 - blob.size / file.size) * 100),
          });
        },
        'image/jpeg',
        quality
      );
    };

    img.onerror = () => {
      URL.revokeObjectURL(url);
      reject(new Error('Failed to load image'));
    };

    img.src = url;
  });
}

// Batch compression
async function compressBatch(files, quality = 0.8) {
  const results = [];
  for (const file of files) {
    try {
      const result = await compressImage(file, quality);
      results.push({ filename: file.name, ...result });
    } catch (error) {
      results.push({ filename: file.name, error: error.message });
    }
  }
  return results;
}

// Usage
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async (e) => {
  const files = Array.from(e.target.files);
  const results = await compressBatch(files, 0.8);

  results.forEach((result) => {
    if (result.error) {
      console.error(`${result.filename}: ${result.error}`);
    } else {
      console.log(
        `${result.filename}: ${result.originalSize} -> ${result.compressedSize} (${result.reductionPercent}% reduction)`
      );
    }
  });
});

Herramientas relacionadas