Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/08/2008, 00:47
Avatar de Ronruby
Ronruby
 
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
[APORTE] Crear thumbnails cuadrados

¿Alguna vez se han preguntado como pueden hacer thumbnails cuadrados como lo hacen sitios web como Hi5?
Con un poquito de logica y la gran libreria PHP GD podemos muy facilmente.

Aqui esta una sencilla solucion:

Código PHP:
<?php

$archivo 
'imagen.jpg';
$tamano 100;
list(
$ancho$alto) = getimagesize($archivo);
if(
$ancho>$alto)
{
    
$new_alto $tamano;
    
$new_ancho = ($ancho/$alto)*$new_alto;

    
$x = ($ancho-$alto)/2;
    
$y 0;
}
else {
    
$new_ancho $tamano;
    
$new_alto = ($alto/$ancho)*$new_ancho;

    
$y = ($alto-$ancho)/2;
    
$x 0;
}

$origen imagecreatefromjpeg($archivo);
$temp imagecreatetruecolor($tamano$tamano);
imagecopyresampled($temp$origen00$x$y$new_ancho$new_alto$ancho$alto);
imagejpeg($temp"nueva_".$archivo100);
imagedestroy($temp);
imagedestroy($origen);

?>
Ahora una explicacion linea por linea (Por lo menos lo vital).

Defino una variable $tamano. Esta variable sera el tamaño de mi thumbnail cuadrado. Yo puse 100 pero puedes usar cualquier otro tamaño sin problemas.
Obtengo el ancho y el largo de la imagen con la funcion de PHP GD getimagesize.

Ahora bien, he aqui la parte crucial de el codigo.
El resize que le haremos a la imagen dependera de si la imagen es mas ANCHA que ALTA, o si es mas ALTA que ANCHA. Esto porque las coordenadas no serian las mismas si no hacemos esto.
Si la imagen es mas ANCHA que ALTA, definimos dos variables: $new_alto que sera igual a la variable $tamaño que tenemos definida un poquito mas arriba (en mi caso 100) y $new_ancho que es PROPORCIONAL al valor de el alto.
Un poquito mas abajo definimos dos variables mas: $x y $y. Donde como la imagen es mas ANCHA que ALTA $x tiene que ser la mitad de la diferencia de las dimensiones. Mientras que $y se mantendra siendo 0.

Ahora bien, si la imagen es mas ALTA que ANCHA, todo sera lo CONTRARIO de lo que planteamos anteriormente (Ya en este punto deben saber porque).

Luego de hecho todo eso, pasamos a crear la imagen $origen que sera el archivo desde donde haremos el resize hacia $temp
Creamos la imagen $temp que sera la imagen en donde copiaremos la imagen $origen pero redimensionada (Y ya que queremos crear un thumbnail cuadrado, el ancho y el alto deben ser los mismos.

Ahora proseguimos a crear el thumbnail cuadrado con la funcion de PHP GD imagecopyresampled.
Copiamos la imagen desde $temp hasta nueva_NOMBREDELAIMAGENTOMADA con una calidad de 100 (la mayor) con la funcion imagejpeg.
Y por ultimo destruimos ambas imagenes, $temp y $origen.

Este codigo es solamente para que tengan una idea, no para que copien y peguen. No se aprende nada con apretar Ctrl+C y Ctrl+V.

Nota:
No tomo en cuenta si la imagen ya es cuadrada ($ancho = $alto), pero eso ya se los dejo a ustedes para que lo editen como lo deseen y lo ajusten a sus necesidades.
Tambien asumo que la imagen a procesar es .jpg, solo agreguen un if para comprobar y realizar esta o aquella accion.
Son libres de mejorarlo y ponerle todas las "chucherias" que quieran.

FAQs de este codigo:

Q: ¿La imagen que tomamos para el codigo puede ser una imagen subida al servidor?
A: Si

Q: ¿Tu hiciste este codigo?
A: Si. Estaba aburrido y decidi hacerlo. Talvez alguien haya planteado esto en otro sitio, pero no tengo ni idea.

Q: El codigo tiene un error de sintaxis ...
A: Nope, no tiene ninguno. Si al tratar de usarlo te dio algun error de sintaxis revisa bien si te falto algo.

Q: No me gusta este codigo
A: No me interesa :)

P.D: No soy bueno con las explicaciones, pero espero que este lo suficientemente claro. Iba a crear unas cuantas imagenes para ilustrar mejor el tutorial pero ando un poquito vago :P

Cualquier duda, inquietud, sugerencia, comentario ... sean bienvenidos

Última edición por Ronruby; 02/04/2009 a las 14:01