¡Hola, bienvenidos nuevamente al Taller de PHP! La clase anterior vimos cómo subir imágenes a nuestro sitio a través de un formulario, en la clase de hoy lo que vamos a hacer es aprender a manipular esas imágenes para generar una imagen más pequeña, llamada thumbnail.
Para poder manipular imágenes vamos a necesitar que nuestro servicio de hosting tenga instalada la libreria LibraryGD, no se preocupen igual ya que la mayorÃa de los servidores de hoy en dÃa la incluyen, incluso si instalaron Xampp en sus computadoras también lo tienen.
Generando imágenes
Antes que nada guardamos en una variable la dirección absoluta (la que expliqué en la clase anterior) a la imagen de origen, por ejemplo, si tenemos en una variable $imagen con el nombre de la imagen y sabemos dónde se guardó, generamos una variable $archivo:
$archivo = "/var/www/elwebmaster.com/uploads/$imagen";
Una vez que tenemos el archivo, debemos corroborar que se trate de una imagen, y obtener la extensión, para ver si se trata de un gif, jpg, png, etc.
$separo = explode( '.', strtolower($imagen) );
$nombre = $separo[0];
$extension = $separo[1];
Con explode lo que hacemos es convertir en array un string, indicándole por que patrón queremos separar, en este caso lo separamos por un punto. Con strtolower lo que hacemos es llevar primero a minúsculas todo, asà cuando generemos nuevas imágenes se generan con nombres todos en minúsculas.
El array que se genera tiene por nombre $separo y tiene dos Ãndices 0 y 1, ya que cada imagen sólo tiene un único punto, por lo que separa el string en dos únicamente.
Luego de esto armamos un switch para ver qué tipo de extensión tiene el archivo y creamos una nueva imagen según la extensión que tenga.
switch( $extension ) {
case 'gif':
$imagen_src = imagecreatefromgif( $archivo );
break;
case 'jpg':
$imagen_src = imagecreatefromjpeg( $archivo );
break;
case 'png':
$imagen_src = imagecreatefrompng( $archivo );
break;
default:
trigger_error(”Formato de imagen no soportada!!!”, E_USER_ERROR);
}
Con imagecreatefrom* lo que hacemos es crear una nueva imagen desde la url absoluta de la imagen que queremos y nos devuelve el identificador a esa nueva imagen creada.
Luego, lo que hay que hacer es crear una nueva imagen true color del tamaño de la nueva imagen que queremos generar, por ejemplo, una imagen 100px de ancho por 120px de alto.
$imagen_dst = @imagecreatetruecolor(100, 120);
Utilizamos el @ antes de la función imagecreatetruecolor para evitar que se muestre un mensaje de error si es que no se puede llegar a generar la imagen en true color (ya que depende de la versión de php que tenemos instalado en el servidor).
Continuamos generándola normal si es que no se generó.
if ( empty($imagen_dst) ) {
$imagen_dst = imagecreate(100, 120);
}
Luego de esto tenemos que setearle el modo de blending a la imagen (para mejorar la calidad de la imagen que vamos a crear), para ello hacemos lo siguiente:
imagealphablending($imagen_dst, false);
Luego, tenemos que copiar la imagen original en el tamaño nuevo que queremos obtener, para ello utilizamos:
imagecopyresampled ( $imagen_dst , $imagen_src , int $dst_x , int $dst_y ,
int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h );
Con esta función lo que hacemos es pasarle como parámetros, la imagen blanca que generamos con el tamaño deseado (imagen de destino), luego la imagen creada a partir de la original, luego le indicamos qué punto x queremos dibujar en la imagen de destino, en nuestro caso va a ser 0, ya que vamos a reemplazar toda la imagen blanca por la nueva imagen. Luego, qué coordenada y de destino (dst_y), que también va a ser 0, a continuación a partir de que coordenada x del origen vamos a copiar, nuevamente es 0 ya que queremos copiar absolutamente toda la imagen, luego la coordenada y del origen (src_y). Finalmente le pasamos el ancho del destino, y el alto del destino (dst_w y dst_h) que va a ser el total de la imagen blanca generada anteriormente y el ancho del origen y el alto del origen, que también va a ser igual al ancho y alto de la imagen original.
Esto quedarÃa asÃ:
imagecopyresampled($imagen_dst,$imagen_src,0,0,0,0,100,120,
imagesx($imagen_src),imagesy($imagen_src));
Ahora generamos un nuevo nombre para la imagen recién generada y en que lugar la queremos guardar
$nueva_ruta = "/var/www/elwebmaster.com/uploads/{$imagen}-th.{$extension}";
Finalmente creamos la imagen definitiva que vamos a usar con imagejpeg y destruimos las imágenes generadas en el proceso para liberar memoria:
imagejpeg( $imagen_dst, $nueva_ruta );
imagedestroy( $imagen_src );
imagedestroy( $imagen_dst );
Espero que se haya entendido ¡hasta la semana que viene!
| << CLASE ANTERIOR |








Martes, 5 de Agosto de 2008 a las 13.34
Muy bueno el tutorial, pero hago una pregunta.
Al guardar una imagen a esta se la puede llamar “a.a.a.a.a.jpg” y sin problemas quedará asÃ.
El explode no servirÃa, lo que habrÃa que hacer es qeu tome el último Ãndice…
$extension = $separo[1];
SerÃa asÃ?:
$extension = $separo[count($separo)];
Saludos, muy bueno el tutorial, lo vengo siguiendo ^^.
Miércoles, 26 de Noviembre de 2008 a las 18.17
disculpen sabran de casualidad como generar reportes desde php a cvs o xls. lo que pretendo es generar un archivo de ese formato de lo que tengo desde la pagina en php y que dandole click en un boton me descarge un archivo ya sea .xls o .cvs
saludos y gracias.