Es habitual que cuando en una web trabajamos con imágenes tengas que presentar la misma en varios tamaños. Una opción es redimensionarla en pantalla con CSS… pero es una mala opción. Es una mala opción porque lo que haces es cargar una imagen grande y luego procesarla para hacerla pequeña, por lo que ralentizas la carga de la página. ¿La solución? Guardar una copia reducida de la imagen, lo que se llama un thumbnail.
¿Y cómo reducir la imagen? Bueno, PHP incluye la librería GD que nos permite tratar y creawr imágenes. Y además, en este caso, vamos a redimensionar la imagen manteniendo la proporción.
//Ruta de la original $rtOriginal="/images/example.jpg"; //Crear variable de imagen a partir de la original $original = imagecreatefromjpeg($rtOriginal); //Definir tamaño máximo y mínimo $max_ancho = 150; $max_alto = 150; //Recoger ancho y alto de la original list($ancho,$alto)=getimagesize($rtOriginal); //Calcular proporción ancho y alto $x_ratio = $max_ancho / $ancho; $y_ratio = $max_alto / $alto;
Con esto ya tenemos los datos para mantener las proporciones de la imagen. Ahora toca calcular el tamaño:
if( ($ancho <= $max_ancho) && ($alto <= $max_alto) ){ //Si es más pequeña que el máximo no redimensionamos $ancho_final = $ancho; $alto_final = $alto; } //si no calculamos si es más alta o más ancha y redimensionamos elseif (($x_ratio * $alto) < $max_alto){ $alto_final = ceil($x_ratio * $alto); $ancho_final = $max_ancho; } else{ $ancho_final = ceil($y_ratio * $ancho); $alto_final = $max_alto; }
Con esto ya tenemos el tamaño de la imagen con las proporciones guardadas. Finalmente nos queda crear la imagen y guardarla:
//Crear lienzo en blanco con proporciones $lienzo=imagecreatetruecolor($ancho_final,$alto_final); //Copiar $original sobre la imagen que acabamos de crear en blanco ($tmp) imagecopyresampled($lienzo,$original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto); //Limpiar memoria imagedestroy($original); //Definimos la calidad de la imagen final $cal=90; //Se crea la imagen final en el directorio indicado imagejpeg($lienzo,"./images/thumb.jpg",$cal);
Todo el cálculo, por otra parte, es necesario sólo si quieres mantener la proporción, si no la cosa queda más sencilla:
//Ruta de la original $rtOriginal="/images/example.jpg"; //Crear variable de imagen a partir de la original $original = imagecreatefromjpeg($rtOriginal); //Definir tamaño máximo y mínimo $ancho_final = 150; $alto_final = 150; //Recoger ancho y alto de la original list($ancho,$alto)=getimagesize($rtOriginal); $lienzo=imagecreatetruecolor($ancho_final,$alto_final); //Copiar $original sobre la imagen que acabamos de crear en blanco ($tmp) imagecopyresampled($lienzo,$original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto); //Limpiar memoria imagedestroy($original); //Definimos la calidad de la imagen final $cal=90; //Se crea la imagen final en el directorio indicado imagejpeg($lienzo,"./images/thumb.jpg",$cal);
Esto para imágenes jpg. Para png la diferencia sería usar imagepng() para crear, y para gif imagegif(). En la web de php puedes investigar más sobre la librería GD y sacarle todo el jugo.
Pensaba que sería más sencillo, lo guardo entre mis marcadores con un fin indeterminado. Un saludo y gracias!
En una foto vertical tomada desde el celular php al redimensionar me rota la imagen, esto solo lo hace cuando es vertical la foto. Tienen alguna idea por qué lo hace?
Gracias por el aporte
Excelente, mil gracias
Lo he probado y va muy bien, Gracias!!!
Gracias viejo
Como se usa con un formulario ??
Saludos
Hola tenia una consulta. Seguramente no me esta andando por algo en la configuracion. En el phpinfo tengo
enabled el GD. Yo no se si es por que al utilizar el GD tenes que poner el path destino y final desde alguna ubicacion que este en el php.ini o es que el path lo pones directamente desde el archivo php creado.
Por otra parte quizas tambien tenga que ver que las imagenes que estoy intentando de subir pensan mas de 9 mb. Si me puede ayudar un poco. El servidor que estoy utilizando es Dattatec.
Muchas Gracias.
Muchas gracias, funciona perfecto, hacía tiempo que le daba vueltas a ésto y me daba pereza ponerme. Ahora me pondré a aplicarlo a menudo, buen aporte
Hola, el ejemplo me ha sido de mucha ayuda, pero no logro hacer que tome las imágenes contenidas en una base de datos
Exelente el codigo, muy sencillo, entendible y limpio… la verdad Felicitaciones de mi parte, sumamente entendible!!! Gracias