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; ?>