Comprimir imágenes antes de subirlas con PHP

Una imagen grande tarda más en subirse, eso está claro. Si quieres subir una imagen grande sin afectar al rendimiento de la página, debes optimizar la imagen y reducir su tamaño. Comprimir una imagen es la mar de útil si queremos reducir su tamaño. Por norma general, los usuarios no suelen optimizar las imágenes que suben a través de un sitio web. En dicho caso, lo ideal es comprimir la imagen antes de subirla y así optimizarla.

Comprimir/optimizar una imagen antes de subirla es una tarea sencilla con PHP. En la función de compresión, el tamaño del archivo se reduce antes de subirlo al servidor. Una imagen comprimida ayuda a reducir el uso del almacenamiento del servidor y ayuda a cargar más rápida la web. En este tutorial, veremos cómo comprimir una imagen antes de subirla al servidor mediante PHP.

Formulario de subida de fichero

Vamos a crear un formulario HTML con un campo input file y un botón submit. Asegúrate de que el tag form contiene los siguientes atributos.

  • method="post"
  • enctype="multipart/form-data"
<form action="upload.php" method="post" enctype="multipart/form-data">
    <label>Selecciona una imagen:</label>
    <input type="file" name="image">
    <input type="submit" name="submit" value="Subir">
</form>

Despues de hacer el submit, la información se enviará al fichero upload.php para su procesamiento.

Comprimir y subir una imagen con PHP

El fichero upload.php se encargará de la compresión de la imagen y las operaciones de subida.

  • compressImage() es una función personalizada que ayuda a comprimir y guardar la imagen en el servidor mediante PHP.
  • Si el fichero se ha enviado: Obtenemos la información del fichero mediante el método $_FILES, lo comprimimos y lo subimos utilizando la función compressImage() y, por último, mostramos el estado de la subida del fichero.
<?php 
 
/* 
 * Función personalizada para comprimir y 
 * subir una imagen mediante PHP
 */ 
function compressImage($source, $destination, $quality) { 
    // Obtenemos la información de la imagen
    $imgInfo = getimagesize($source); 
    $mime = $imgInfo['mime']; 
     
    // Creamos una imagen
    switch($mime){ 
        case 'image/jpeg': 
            $image = imagecreatefromjpeg($source); 
            break; 
        case 'image/png': 
            $image = imagecreatefrompng($source); 
            break; 
        case 'image/gif': 
            $image = imagecreatefromgif($source); 
            break; 
        default: 
            $image = imagecreatefromjpeg($source); 
    } 
     
    // Guardamos la imagen
    imagejpeg($image, $destination, $quality); 
     
    // Devolvemos la imagen comprimida
    return $destination; 
} 
 
 
// Ruta subida
$uploadPath = "uploads/"; 
 
// Si el fichero se ha enviado
$status = $statusMsg = ''; 
if(isset($_POST["submit"])){ 
    $status = 'error'; 
    if(!empty($_FILES["image"]["name"])) { 
        // File info 
        $fileName = basename($_FILES["image"]["name"]); 
        $imageUploadPath = $uploadPath . $fileName; 
        $fileType = pathinfo($imageUploadPath, PATHINFO_EXTENSION); 
         
        // Permitimos solo unas extensiones
        $allowTypes = array('jpg','png','jpeg','gif'); 
        if(in_array($fileType, $allowTypes)){ 
            // Image temp source 
            $imageTemp = $_FILES["image"]["tmp_name"]; 
             
            // Comprimos el fichero
            $compressedImage = compressImage($imageTemp, $imageUploadPath, 75); 
             
            if($compressedImage){ 
                $status = 'success'; 
                $statusMsg = "La imagen se ha subido satisfactoriamente."; 
            }else{ 
                $statusMsg = "La compresion de la imagen ha fallado"; 
            } 
        }else{ 
            $statusMsg = 'Lo sentimos, solo se permiten imágenes con estas extensiones: JPG, JPEG, PNG, & GIF.'; 
        } 
    }else{ 
        $statusMsg = 'Por favor, selecciona una imagen.'; 
    } 
} 
 
// Mostrar el estado de la imagen 
echo $statusMsg; 
 
?>

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP