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.

