Justi 4 de agosto de 2008 a las 14.45
   Imprimir artículo
elWebmaster.com

Taller de PHP: Manipulación de imágenes


Taller de PHP: Manipulación de imágenes¡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

CLASE SIGUIENTE >>


Enviar a Del.icio.us Enviar a Meneame Enviar a Digg Enviar a Fresqui Enviar a Enchilame

Comentarios (16)

  1. BrianPr dice:

    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 ^^.

  2. roxana dice:

    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.

  3. Virginia dice:

    hola roxana, te paso un link sobre exel y php http://www.codeplex.com/PHPExcel

  4. Paola dice:

    hola como estan la verdad q es el mejor curso de php q hay visto y me encanta voy por la clase 28 y lo empece ayer asi como veran estoy re prendida en el pero me freno hoy con un error q me largo php y es el siguiente :
    Warning: move_uploaded_file(C:\wamp\www\paola\uploads) [function.move-uploaded-file]:
    failed to open stream:
    Permission denied in C:\wamp\www\paola\contacto_script.php on line 31

    creo q niega los permisos a la carpeta para q ingrese la foto ,, soy nueva en esto por eso es q le pregunto bueno los saludos a todos

  5. Justi dice:

    @Paola hola, efectivamente no encuentra la carpeta “C:\wamp\www\paola\uploads” o no tiene permisos para subir el archivo ahí. El error te lo está tirando en la linea 31 del archivo contacto_script.php

  6. lorena dice:

    tengo una consulta estoy creando un sitio pa dejar curriculums, y seria optimo incluir la foto, me explicarias un poco lo de las direcciones o ruta como se generarian para guardar cada foto de cada curriculum? por favor

  7. Juan dice:

    Estoy haciendo un site, el cual dejo subir imagenes a los usuarios, mi pregunta es si es peligroso dar permisos 777 a la carpeta ?
    Si bien chequeo que sea una imagen solamente para que no me suban scripts, me intriga eso, no pude hacerlo funcionar de otra forma que no sea 777 ya que una vez que subo la imagen desde el mismo script le achico proporcionalmente el tamaño por lo que el permiso 755 no me funciona.
    gracias por sus comentarios.

  8. Miguel dice:

    bueno la verdad ing. aprendi muxo bueno no se si se podia publicar ejercicios de suma de fechas o incremento de dias auna fecha o formulario de vacaciones y cosas similares bueno gracias por lo aprendid

  9. Guada dice:

    LibraryGD en Linux? Qué raro!
    Y cómo se haría para utilizar ImageMagick y qué tal estaría?

  10. Juan dice:

    hola, como se podría hacer para que las imágenes fueran de un servidor externo, algo como
    $imagen_data=file_get_contents(“http://www.todosenrumba.com/img/logos/Apple_logo.png”);
    es decir sin que sea un upload, ya que en la pagina que tengo solo se envia la ruta de la imagen.
    saludos.

  11. Franklin Rivas dice:

    Buen aporte, deberian colocar los ejercicios listo en zip para poder verificar los errores, asi como los hace el quique. que son muy ilustrativos

  12. Walter Ramos dice:

    Hola
    El curso está muy bueno y es my práctico.
    Necesito saber como colocar colocar un icono del sitio que tengo programado en PHP
    de manera que en el navegador salga el icono como suele suceder con sitios como facebook, gmail, yahoo y otros.
    Gracias de antemano

  13. xavi heredia dice:

    Hola Walter Ramos,
    has de crear la imagen que quieras visualizar como icono en tu página y nombrarla “favicon.ico”.
    Luego la subes a la raíz de tu sitio y ya está.
    PD: Paola tiene razón, este es el mejor tutorial de .php que encontré.
    Gracias!

  14. José Zavala dice:

    Muy buena explicacion paso a paso el PHP.

    GRacias me fue muy util

  15. Estela dice:

    hola quisiera que me ayuden tengo este codigo para alzar imagenes pero me da error en una parte y no le encuentro el error quiesiera que me ayuden…!!! me marca el error en
    -$Nueva_Imagen = @imagecreatetruecolor($nancho, $nalto); y tamebien
    -imagepng($Nueva_Imagen, $destino, 100);}
    este es el codigo completo…
    <?php
    session_start();
    include “conexion.php”;
    extract($_POST);
    $logo= $_FILES[‘logo’][‘name’];
    $logotam= $_FILES[‘logo’][‘size’];
    $extension = explode(“.”,$_FILES[‘logo’][‘name’]);
    $num = count($extension)-1;
    $tipo= $extension[$num];
    if($password==$confipassword){
    if (!empty($logo))
    {
    if(($tipo == “jpg”) OR ($tipo == “JPG”) OR ($tipo == “gif”) OR ($tipo == “GIF”) OR ($tipo == “png”) OR ($tipo == “PNG”))
    {
    if($logotam <750000)
    {
    $prefijo = substr(md5(uniqid(rand())),0,30);
    $Propfile = getimagesize($_FILES[‘logo’][‘tmp_name’]);
    $Ancho = $Propfile[0];
    $Alto = $Propfile[1];
    if ($Ancho<=1024){
    if($Ancho<=200)
    {
    if($Alto<=200){
    $nancho=$Ancho; $nalto=$Alto;
    }else{
    $nancho=($Ancho * 200)/$Alto; $nalto=200;
    }
    }if($Alto=$Alto){
    $nalto=(200 * $Alto)/$Ancho; $nancho=200;
    }else{
    $nancho=($Ancho * 200)/$Alto; $nalto=200;
    }
    }
    }else{ echo “La imagen es muy grande”;}
    $file=”$prefijo.$tipo”;
    $destino=”./logos/”.$file;
    $Tempfile = $_FILES[‘logo’][‘tmp_name’];
    if (is_uploaded_file($Tempfile)){
    move_uploaded_file($Tempfile, $destino);}
    $Nueva_Imagen = @imagecreatetruecolor($nancho, $nalto);
    if(($tipo == “jpg”) OR ($tipo == “JPG”) OR ($tipo == “jpeg”) OR ($tipo == “JPEG”)){
    $Origen = imagecreatefromjpeg($destino);
    imagecopyresized($Nueva_Imagen, $Origen, 0, 0, 0, 0, $nancho, $nalto, $Ancho, $Alto);
    imagejpeg($Nueva_Imagen, $destino, 100);}
    if(($tipo == “png”) OR ($tipo == “PNG”)){
    $Origen = imagecreatefrompng($destino);
    imagecopyresampled ($Nueva_Imagen, $Origen, 0, 0, 0, 0, $nancho, $nalto, $Ancho, $Alto);
    imagepng($Nueva_Imagen, $destino, 100);}
    if(($tipo == “gif”) OR ($tipo == “GIF”)){
    $Origen = imagecreatefromgif($destino);
    imagecopyresampled ($Nueva_Imagen, $Origen, 0, 0, 0, 0, $nancho, $nalto, $Ancho, $Alto);
    imagegif($Nueva_Imagen, $destino, 100);}
    $query=mysql_query(“insert into postulante (email, password, nombresapelli, sexo, fechnac, estadocivil, cinro, direccion, pais, ciudad, barrio,
    telefono, nrocelular, logo) values ( ‘”. stripslashes(htmlentities($email)) .”‘, md5(‘$password’),'”. stripslashes(htmlentities($nombresapelli)) .”‘,
    ‘$sexo’, ‘$fechnac’ , ‘”.stripslashes(htmlentities($estadocivil)).”‘, ‘$cinro’, ‘”. stripslashes(htmlentities($direccion)) .”‘,
    ‘”. stripslashes(htmlentities($pais)) .”‘, ‘”. stripslashes(htmlentities($ciudad)) .”‘, ‘”. stripslashes(htmlentities($barrio)) .”‘,
    ‘$telefono’, ‘$nrocelular’, ‘$file’)”,$con ) or die(mysql_error());
    echo $query;
    $insert = mysql_query($query,$con);
    $info=”Registro guardado…!!!”;
    }else{$info=”El Archivo es muy grande 750 kb max”;}
    }else{$info=”Tipo de Archivo no admitido jpg jpeg png”;}
    }else{$info=”Archivo no encontrado, se ha agregado una imagen default que luego podra modificar”;}
    }else{$info=” Las Contraseñas no coinciden”;}
    ?>

  16. Estela dice:

    hola quisiera que me ayuden tengo este codigo para alzar imagenes pero me da error en una parte y no le encuentro el error quiesiera que me ayuden…!!! me marca el error en
    -$Nueva_Imagen = imagecreatetruecolor($nancho, $nalto); y tamebien
    -imagepng($Nueva_Imagen, $destino, 100);}
    este es el codigo completo…
    <?php
    session_start();
    include “conexion.php”;
    extract($_POST);
    $logo= $_FILES[‘logo’][‘name’];
    $logotam= $_FILES[‘logo’][‘size’];
    $extension = explode(“.”,$_FILES[‘logo’][‘name’]);
    $num = count($extension)-1;
    $tipo= $extension[$num];
    if($password==$confipassword){
    if (!empty($logo))
    {
    if(($tipo == “jpg”) OR ($tipo == “JPG”) OR ($tipo == “gif”) OR ($tipo == “GIF”) OR ($tipo == “png”) OR ($tipo == “PNG”))
    {
    if($logotam <750000)
    {
    $prefijo = substr(md5(uniqid(rand())),0,30);
    $Propfile = getimagesize($_FILES[‘logo’][‘tmp_name’]);
    $Ancho = $Propfile[0];
    $Alto = $Propfile[1];
    if ($Ancho<=1024){
    if($Ancho<=200)
    {
    if($Alto<=200){
    $nancho=$Ancho; $nalto=$Alto;
    }else{
    $nancho=($Ancho * 200)/$Alto; $nalto=200;
    }
    }if($Alto=$Alto){
    $nalto=(200 * $Alto)/$Ancho; $nancho=200;
    }else{
    $nancho=($Ancho * 200)/$Alto; $nalto=200;
    }
    }
    }else{ echo “La imagen es muy grande”;}
    $file=”$prefijo.$tipo”;
    $destino=”./logos/”.$file;
    $Tempfile = $_FILES[‘logo’][‘tmp_name’];
    if (is_uploaded_file($Tempfile)){
    move_uploaded_file($Tempfile, $destino);}
    $Nueva_Imagen = imagecreatetruecolor($nancho, $nalto);
    if(($tipo == “jpg”) OR ($tipo == “JPG”) OR ($tipo == “jpeg”) OR ($tipo == “JPEG”)){
    $Origen = imagecreatefromjpeg($destino);
    imagecopyresized($Nueva_Imagen, $Origen, 0, 0, 0, 0, $nancho, $nalto, $Ancho, $Alto);
    imagejpeg($Nueva_Imagen, $destino, 100);}
    if(($tipo == “png”) OR ($tipo == “PNG”)){
    $Origen = imagecreatefrompng($destino);
    imagecopyresampled ($Nueva_Imagen, $Origen, 0, 0, 0, 0, $nancho, $nalto, $Ancho, $Alto);
    imagepng($Nueva_Imagen, $destino, 100);}
    if(($tipo == “gif”) OR ($tipo == “GIF”)){
    $Origen = imagecreatefromgif($destino);
    imagecopyresampled ($Nueva_Imagen, $Origen, 0, 0, 0, 0, $nancho, $nalto, $Ancho, $Alto);
    imagegif($Nueva_Imagen, $destino, 100);}
    $query=mysql_query(“insert into postulante (email, password, nombresapelli, sexo, fechnac, estadocivil, cinro, direccion, pais, ciudad, barrio,
    telefono, nrocelular, logo) values ( ‘”. stripslashes(htmlentities($email)) .”‘, md5(‘$password’),'”. stripslashes(htmlentities($nombresapelli)) .”‘,
    ‘$sexo’, ‘$fechnac’ , ‘”.stripslashes(htmlentities($estadocivil)).”‘, ‘$cinro’, ‘”. stripslashes(htmlentities($direccion)) .”‘,
    ‘”. stripslashes(htmlentities($pais)) .”‘, ‘”. stripslashes(htmlentities($ciudad)) .”‘, ‘”. stripslashes(htmlentities($barrio)) .”‘,
    ‘$telefono’, ‘$nrocelular’, ‘$file’)”,$con ) or die(mysql_error());
    echo $query;
    $insert = mysql_query($query,$con);
    $info=”Registro guardado…!!!”;
    }else{$info=”El Archivo es muy grande 750 kb max”;}
    }else{$info=”Tipo de Archivo no admitido jpg jpeg png”;}
    }else{$info=”Archivo no encontrado, se ha agregado una imagen default que luego podra modificar”;}
    }else{$info=” Las Contraseñas no coinciden”;}
    ?>

Deja tu opinión

© 2007 - 2008 elWebmaster.com | Powered by Wordpress | Diseño CSS y XHTML válido. | Algunos íconos basados en FamFamFam Mini
Acceder