Vamos então começar com o básico, que é utilizar a GD para criar thumbnails (miniaturas) de fotos.

Para isso, precisaremos criar uma função que calcule o tamanho proporcional da miniatura, de acordo com uma dada largura e altura máximas. Então, vamos à função:

function criaMiniatura($imagem,$destination,$larguraMax,$alturaMax)
{
  $tamanho = getimagesize($imagem);
  $largura = $tamanho[0];
  $altura = $tamanho[1]
  //agora vamos ao calculo da proporcao
  if($largura > $larguraMax)
  {
    $largura = $larguraMax;
    $altura = ($largura * $tamanho[1]) / $tamanho[0];
  }
  if($altura > $alturaMax)
  {
    $altura = $alturaMax;
    $largura = ($tamanho[0] * $altura) / $tamanho[1];
  }

  //abrir a imagem original
  $img = imagecreatefromjpeg($imagem);

  //criamos uma nova imagem em branco, q sera a miniatura
  $thumb = imagecreatetruecolor($largura, $altura);

  //agora, copiamos a foto pra nova imagem
  imagecopyresampled($thumb, $img, 0, 0, 0, 0, $largura, $altura, $tamanho[0], $tamanho[1]);

  //e agora eh soh salvar
  imagejpeg($thumb,$destination,90);
}

Para utilizar a função:

criaMiniatura("foto.jpg","fotothumb.jpg",120,90);

A nova miniatura será salva no formato 120×90,  com o nome “fotothumb.jpg” .