Hola.
Yo lo que suelo hacer es, además de crear los thumbs con php, utilizar un fondo (tipo canvas) para que ocupen exactamente lo mismo.
Me explico:
Código PHP:
$origen = imagecreatefromjpeg($imagen);
$x = imagesx($origen);
$y = imagesy($origen);
$nx = 200; // establezco el ancho máximo
$ny = $y*$nx/$x; // regla de 3 que comentan por ahí arriba
$destino = imagecreatetruecolor(200,200); // tamaño total de la imagen: 200x200 (esto vendría a ser el canvas)
imagecopyresized($destino,$origen,0,0,0,0,$nx,$ny,$x,$y);
$destino_tn = 'ruta-de-destino/tn_'.$fileName;
imagejpeg($destino , $destino_tn , 100);
De esta manera, verás un fondo negro ocupando 200x200 y dentro la imagen. Eso sí, si el alto de la imagen es más pequeño que 200, se verá pegada a la parte superior y dejará un hueco negro en la inferior. Para evitar esto, tendrás que utilizar algo más de matemática y modificar un poco la función imagecopyresized:
Código PHP:
$posx = (200 - $nx) / 2; // si el ancho de la imagen se ajusta a los 200px, el resultado será 0
$posy = (200 - $ny) / 2; // si, lo que interesa, que es el alto, es de pongamos 150px, el resultado será 25.
// Y esto nos centraría la imagen en nuestro canvas.
imagecopyresized($destino,$origen,$posx,$posy,0,0,$nx,$ny,$x,$y); // ahora indicamos las coordenadas del punto
// de origen y de destino
Creo que no me he dejado nada atrás. Que alguien me corrija si es así.
Espero que sirva de ayuda. Un saludo.