¿Te ha tocado desarrollar algún sistema en el que el usuario debe subir imágenes y estas a su vez deben respetar algún tamaño específico? El día de hoy aprenderemos como redimensionar una imagen con php, algo muy útil que te puede evitar muchos dolores de cabeza.
Hay ocasiones en las que tenemos que desarrollar sistemas que permitan subir múltiples imágenes al día, si desde un principio no le especificamos al usuario las dimensiones deseadas el subirá cualquier imagen sin importar las recomendaciones dadas.
El problema más común en estas situaciones es que al final tendremos almacenadas cientos de imágenes con proporciones muy fuera de lo que deseamos y a su vez la velocidad de carga en nuestro sistema se puede ver afectada ya que habrá imágenes muy pesadas por cargar.
Para evitar esto, desde nuestro sistema podemos prever y optimizar cualquier imagen que suban, el día de hoy te comparto un código bastante útil para aprender como redimensionar una imagen con php y al final almacenar solo imágenes con el tamaño deseado para nuestro sistema.
Código
//Como redimensionar una imagen con php <?php function redimensionar_imagen($nombreimg, $rutaimg, $xmax, $ymax){ $ext = explode(".", $nombreimg); $ext = $ext[count($ext)-1]; if($ext == "jpg" || $ext == "jpeg") $imagen = imagecreatefromjpeg($rutaimg); elseif($ext == "png") $imagen = imagecreatefrompng($rutaimg); elseif($ext == "gif") $imagen = imagecreatefromgif($rutaimg); $x = imagesx($imagen); $y = imagesy($imagen); if($x <= $xmax && $y <= $ymax){ echo "<center>Esta imagen ya esta optimizada para los maximos que deseas.<center>"; return $imagen; } if($x >= $y) { $nuevax = $xmax; $nuevay = $nuevax * $y / $x; } else { $nuevay = $ymax; $nuevax = $x / $y * $nuevay; } $img2 = imagecreatetruecolor($nuevax, $nuevay); imagecopyresized($img2, $imagen, 0, 0, 0, 0, floor($nuevax), floor($nuevay), $x, $y); echo "<center>La imagen se ha optimizado correctamente.</center>"; return $img2; } $imagen_optimizada = redimensionar_imagen('imagen.jpg','images/imagen.jpg',700,700); imagejpeg($imagen_optimizada, "images/imagen_optimizada.jpg"); ?>
Para iniciar tenemos la función redimensionar_imagen que recibe 4 parámetros (nombre de la imagen, ruta donde esta almacena la imagen, el máximo que deseamos para x y el máximo para y).
En las primeras líneas obtenemos la extensión de la imagen partiendo del nombreimg recibido y la almacenamos en la variable $ext.
A continuación, realizamos un par de validaciones para saber si la imagen es jpg, png o gif, dependiendo de la condición que se cumpla mandamos llamar un método nativo de php que recibe el parámetro $rutaimgy el resultado lo guardamos en la variable $imagen.
Los métodos que se llamaran en la sección anterior dependiendo del formato de nuestra imagen son: imagecreatefromjpeg(), imagecreatefrompng(), imagecreatefromgif(), con cualquiera de estos lo único que hacemos es crea una nueva imagen a partir de un fichero o de una URL.
En las variables $x y $yalmacenamos el ancho y alto de la imagen creada anteriormente mediante el uso de los métodos imagesx e imagesy los cuales reciben como parámetro una imagen.
En la siguiente condición $x <= $xmax && $y <= $ymax lo único que hacemos es validar que si el ancho y alto es menor o igual a las dimensiones máximas que especificamos simplemente se salga ya que la imagen se encuentra dentro del rango que deseamos.
A continuación, tenemos otra estructura de control en la que validamos si $x >= $y, para el caso de que el ancho si sea mayor que el alto, a la variable $nuevax le asignamos el valor máximo que deseamos para x que tenemos almacenado en la variable $xmax, enseguida hacemos una simple regla de 3 para obtener el valor de yel cual almacenaremos en $nuevay.
En el caso contrario hacemos lo mismo pero en base a y, a $nuevay le asignamos el máximo que deseamos para y y obtenemos x por medio de una regla de 3.
Hasta este punto ya tenemos los nuevos valores de xyy para redimensionar la imagen original. Por medio del método nativo de php imagecreatetruecolor creamos el lienzo donde pintaremos más adelante nuestra imagen y lo almacenamos en la variable $img2.
Finalmente, llamamos el método de php imagecopyresized el cual se encargara de copiar y cambiar el tamaño de la imagen y recibe los siguientes parámetros:
- $img2 : lienzo donde pintaremos la imagen destino
- $imagen : imagen original
- 0,0 : coordenada xyy del punto de destino
- 0,0 : coordenada xyy del punto de origen
- $nuevax : ancho del destino
- $nuevay : alto del destino
- $x : ancho original
- $y : alto original
Para probar nuestra función agregamos las últimas dos líneas, simplemente llamamos la función redimensionar_imagen y guardamos la nueva imagen generada.
Resultados
Hasta aquí terminamos con esta explicación de como redimensionar una imagen con php, espero que te sirva para futuros desarrollos que realices, si te quedo alguna duda envíame un mail a contacto@denisseestradasiempre estoy atenta a cualquier consulta.
Saludos!
Muy buen ejemplo para redimensionar imagenes, y muy bien explicado.
La regla de 3 es para que la imagen conserve su proporcion cierto?
Claro, por medio de la regla de 3 sacamos el valor proporcional al máximo que definimos, con esto nos aseguramos que la imagen no se deforme o se genere con valores no proporcionales.
Y si subimos un gif o una .png o un jpeg… puffffff a la traste todo lo bonito… jajaajajajaja…
Hola amigo,
Funciona perfectamente para formato jpg, jpeg y png, de hecho para lo que esta hecha la función, que es redimensionar la imagen, también funciona bien para los gifs.. el problema con los gifs viene con la animación. Cabe notar que las lineas de al final son únicamente para propósitos de prueba.
Saludos!
muy chiquilla lo voy a intentar, me gusta para mis imagenes cuidate saludos
Muchas gracias, saludos!
se deforma la imagen, esta orrible. que puedo hacer ?
Hola Jad,
Si has seguido el ejemplo la imagen no debería haberse deformado, asegúrate de haber seguido todos los pasos, cualquier duda me comentas, saludos!
Muy linda función. Para agregar para aquellos como yo que necesitan renombrar imágenes agregar un imagedestroy($imagenOriginal); para que no quede por ahí mariposeando la imagen en nuestro server jajajaja
Muy buena function… Saludos
Gracias por el dato amigo, saludos!
Gracias por este gran aporte, me ha venido como anillo al dedo, justo cuando mas lo necesitaba. Le he hecho algunas modificaciones para ajustarlo e mi proyecto. Sin embargo he observado que en algunos casos la imagen pierde calidad en gran medido, a ver si le echas un vistazo a eso. Saludos Denisse!!
Hola Ventura, me alegra que te sirviera, claro revisare ese detalle que me comentas.
Saludos!
Hola Dennisse
Funciona muy bien.
Solamente que el nuevo archivo tiene el nombre: resource id #4
Qué debo hacer para que tenga el nombre del archivo jpg inicial.
Gracias
Lo voy a utilizar.
Coloco esta url en los créditos.
gracias!
Hola Camilo, te agradezco, saludos!
Gracias me funcional muy bien.
Hola Denisse Estrada gracias por tu aportación, solo una cosa cuando subo fotos desde una aplicación WEB, es decir se toman una selfie, no me funciona. alguna idea? Saludos desde Acapulco Mexico
Excelente ejemplo de como redimensionar una imagen, me sirvió para mi proyecto. Gracias.
Hace más de 3 años y medio que has escrito este método y hoy lo he descubierto y usado con absoluto acierto y sin problemas de ningún tipo. La únicas dos sugerencias que se pueden aportar son:
Al llamar a la función, pasa los parámetros como variables: por ejemplo “redimensionar_imagen($foto,$destino,150,150)”
Al recoger el resultado y guardarlo, usa también esos mismos parámetros: “imagejpeg($imagen_optimizada, “carpeta_imagenes/”.$foto)”. Así ya sobreescribes la imagen original con la redimensionada. De ese modo no necesitas realizar un imagedestroy, tal y como comenta lurugardo en agosto de 2017.
Y la segunda sugerencia es incluir en la función los comentarios de la explicación posterior acerca de lo que cada línea realiza (esto ya es un poco .puntilloso, pero a neófitos como yo les resulta más fácil seguir el código).
Por otra parte, como ya te he dicho, me ha venido genial tu función. Muchas gracias.
muchas gracias Denisse, gran ayuda.
Hola Denisse:
Perfecto para modificar el tamaño, es lo que necesitaba, pero me modifica los colores, ¿se podra hacer que los conserve? Con tu funcion yo estoy obligando a que las imagenes sean cuadradas.
Muchas Gracias
Te añado una mejora, controlar la orientación de la imagen en los JPG.
Dentro del IF donde se hace el imagecreatefromjpeg (cuidado poner {llaves}) añadir el siguiente código (entre las líneas 8 y 9):
$exif = exif_read_data($rutaimg); //sacamos cabeceras EXIF
$orientation = $exif[‘Orientation’]; //tomamos la orientación
switch ($orientation) { //segun la orientación actuamos
case 2:
imageflip($imagen, IMG_FLIP_HORIZONTAL);
break;
case 3:
$imagen = imagerotate($imagen, 180, 0);
break;
case 4:
imageflip($imagen, IMG_FLIP_VERTICAL);
break;
case 5:
$imagen = imagerotate($imagen, -90, 0);
imageflip($imagen, IMG_FLIP_HORIZONTAL);
break;
case 6:
$imagen = imagerotate($imagen, -90, 0);
break;
case 7:
$imagen = imagerotate($imagen, 90, 0);
imageflip($imagen, IMG_FLIP_HORIZONTAL);
break;
case 8:
$imagen = imagerotate($imagen, 90, 0);
break;
}
Un saludo!