Comprimir ó reducir el peso de una imagen en PHP

Comprimir ó reducir el peso de una imagen en PHP

La necesidad de comprimir ó reducir el peso de una imagen en PHP aparece porque las fotos que suben los usuarios —sobre todo desde celulares— suelen venir exageradamente grandes para lo que realmente necesita una aplicación web.

Además de ocupar y llenar más rápido nuestro almacenamiento en el servidor, las imágenes pesadas suelen demorarse más en cargar en la vista de un desarrollo PHP. Con la función imagejpeg() podemos optimizar, comprimir ó reducir el peso de una imagen en PHP.

La función imagejpeg() viene con estos parámetros:

imagejpeg("la imagen pesada", "la ruta destino donde la vamos a guardar", "el nivel de calidad de la imagen resultante")

El nivel de calidad es cualquier número del 1 al 100, así:

  • 100
    máxima calidad
    casi sin compresión
    archivos muy pesados
  • 75
    buena calidad visual
    bastante reducción de peso
    es el valor más usado
  • 50
    más compresión
    empieza a verse pérdida de calidad
  • 20
    muy comprimido
    imagen fea y borrosa

Basados en el nivel de calidad, podemos tener presente esta tabla de recomendaciones con este tema de las imágenes:

Calidad    Uso
86-100    Fotografía profesional
50-85      Web y sistemas administrativos
30-49      Optimización agresiva
<29          Miniaturas o imágenes desechables

Ejemplo de reducir el peso de una imagen en PHP


Tenemos un formulario en html con un campo tipo ‘file’ llamado «archivos» para cargar multiples archivos, entre ellos imágenes y PDFs, en un directorio de nuestro servidor.

<label for="pdfs">Cargue sus imágenes y documentos PDF:</label>
<input type="file"
id="pdfs"
name="archivos[]"
accept=".pdf"
multiple
required>

Del lado de PHP tenemos entonces el siguiente script para recibir las imágenes, reducirles el tamaño y guardarlas en el directrio «subidas/»

<?php

$target_dir = "subidas/";
$calidad = '40';
$total_archivos = count($_FILES['archivos']['name']);

for ($i = 0; $i < $total_archivos; $i++) {
  $nombre = $_FILES['archivos']['name'][$i];

  if(strpos($nombre, 'jpg') || strpos($nombre, 'jpeg')){
      $imagen = imagecreatefromjpeg($_FILES['archivos']['tmp_name'][$i]);
      imagejpeg($imagen, $target_dir.$nombre, $calidad);
  }

}

//Liberamos memoria
imagedestroy($imagen);
?>

Y así de sencillo es (he conocido desarrolladores de Laravel que prefieren que el usuario comprima la imagen dando vueltas por WhatsApp). Si la carga de archivos desde la vista está garantizada para imágenes, podemos prescindir del condicional if(), pero como había dicho que también podemos cargar archivos PDFs, entonces con el if() filtramos solo las imágenes JPG. Ahora, adicionamos la condicional para guardar los archivos PDFs en el mismo directorio «subidas/».

<?php

$target_dir = "subidas/";
$calidad = '40';
$total_archivos = count($_FILES['archivos']['name']);

for ($i = 0; $i < $total_archivos; $i++) {
    $nombre = $_FILES['archivos']['name'][$i];

    if(strpos($nombre, 'jpg') || strpos($nombre, 'jpeg')){
        $imagen = imagecreatefromjpeg($_FILES['archivos']['tmp_name'][$i]);
        imagejpeg($imagen, $target_dir.$nombre, $calidad);
    }

    if(strpos($nombre, 'pdf') || strpos($nombre, 'PDF')){
        move_uploaded_file($_FILES['archivos']['tmp_name'][$i], $target_dir.$nombre);
    }
}

//Liberamos memoria
imagedestroy($imagen);
?>

Y listo.

También podemos ver cómo comprimir una imagen BMP con GIMP.

Reducir el tamaño de una imagen BMP

Comparte esto en
Publicado en Desarrollo Web.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *