Muchas veces cuando subimos imagenes a una web, queremos también guardar un thumbnail para hacer un preview de las imágenes guardadas, pero no queda muy prolijo mostrar los thumbs de distintas dimensiones uno al lado del otro. Una solución es guardar los thumbs de la misma dimensión (cuadrados por ejemplo) tomando el centro de la imagen y cortando "lo que sobra". Hacer esto es muy fácil usando la librería GD de PHP, acá les dejo una función (traté de comentarla un poco porque no soy muy bueno documentando, :P):
function saveSquareThumb($file, $savePath, $thumbD=120){
//Obtenemos la informacion de la imagen, el array info tendra los siguientes indices:
// 0: ancho de la imagen
// 1: alto de la imagen
// mime: el mime_type de la imagen
$info = getimagesize($file);
//Dependiendo del mime type, creamos una imagen a partir del archivo original:
switch($info['mime']){
case 'image/jpeg':
$image = imagecreatefromjpeg($file);
break;
case 'image/gif';
$image = imagecreatefromgif($file);
break;
case 'image/png':
$image = imagecreatefrompng($file);
break;
}
//Si el ancho es igual al alto, la imagen ya es cuadrada, por lo que podemos ahorrarnos unos pasos:
if($info[0] == $info[1]){
$xpos = 0;
$ypos = 0;
}
//Si la imagen no es cuadrada, hay que hacer un par de averiguaciones:
else{
if($info[0] > $info[1]){
//imagen horizontal
$xpos = ceil(($info[0] - $info[1]) /2);
$ypos = 0;
$width = $info[1];
$height = $info[1];
}else{
//imagen vertical
$ypos = ceil(($info[1] - $info[0]) /2);
$xpos = 0;
$width = $info[0];
$height = $info[0];
}
}
//Creamos una nueva imagen cuadrada con las dimensiones que queremos:
$image_new = imagecreatetruecolor($thumbD, $thumbD);
$bgcolor = imagecolorallocate($image_new, 255, 255, 255);
imagefilledrectangle($image_new, 0, 0, $thumbD, $thumbD, $bgcolor);
imagealphablending($image_new, true);
//Copiamos la imagen original con las nuevas dimensiones
imagecopyresampled($image_new, $image, 0, 0, $xpos, $ypos, $thumbD, $thumbD, $width, $height);
//Guardamos la nueva imagen como jpg con una calidad del 85%
imagejpeg($image_new, $savePath.'.jpg', 85);
}
Y eso es todo... hay un par de cositas que se pueden configurar mejor, como ser el archivo de salida, es muy sencillo agregarle una variable más para poder guardarlo en cualquier otro formato, pero yo necesitaba algo asi de básico, y me anda muy bien
Como dije arriba, traté de ponerle comentarios para masomenos explicar lo que hace la función, por ahí la única parte que no se entiende muy bien es la de los datos que seteamos si la imagen es vertical u horizontal, que trataré de explicar ahora...
Supongamos que tenemos una imagen horizontal, lo primero que hacemos es setear la posicion desde donde comenzaremos a copiar la imagen en x = (ancho - alto) /2; y = 0. Despues seteamos que el nuevo alto y el nuevo ancho sean iguales al alto original de la imagen (que es menor que el ancho, se acuerdan?).
De esta forma cuando cuando copiamos la imagen original a la nueva imagen obtendremos un cuadrado cuyo alto y ancho seran iguales al alto original de la imagen, tomando el centro de la imagen y descartando lo que sobra a los lados. No se entiende? Dicen que una imagen vale más que mil palabras:
Obviamente, cuando la imagen es vertical la lógica es la misma...
Espero les sirva!

