Activer la bibliothèque
Tout d'abord si vous voulez tester cette fonction en local, vous devez activer la GD library. Donc lancez easyphp (sur les autres logiciels je sais pas comment ça marche). Faites un clique droit sur le "e" (l'icone d'easyphp) dans la barre de tache > Configuration > Extention PHP. Ensuite sélectionné le champ "php_gd2" puis "appliquer".
En ligne, dans la grande majorité des cas elle est activé par défaut.

La fonction
Je vais décomposer la fonction en plusieurs partie pour mieux comprendre.
<?php    function miniature($chemin_original, $chemin_tumb, $fichier_image, $largeur_tumb){

$info = getimagesize($chemin_original.$fichier_image);
Ceci permet de connaitre les informationn de l'image et notamment le type. En fait la fonction va renvoyer un tableau qui ressemble à ceci :
Array (   0 => 278,   1 => 220,   2 => 2, 3 => 'width="278" height="220"',   'bits' => 8,   'channels' => 3 )
Ce qui nous interesse ici est la case 2 qui correspond au type. Ici nous avons plusieurs valeurs possibles :
1 = GIF, 2 = JPG, 3 = PNG, 6=bmp
Nous nous servirons aussi de la largeur et hauteur qui correspondent à la case 0 et 1.

if($info[2]==1) {
  $image_origine = imagecreatefromgif("$chemin_original/$fichier_image");
}else{
  if($info[2]==2){
    $image_origine = imagecreatefromjpeg("$chemin_original/$fichier_image");
  }else{
    if($info[2]==3){
      $image_origine = imagecreatefrompng("$chemin_original/$fichier_image");
    }
  }
}
Ici, pour simplifier, nous ouvrons le fichier (le nom est trompeur). Nous faisons donc du cas par cas en utilisant les infos que nous avons récolté précédemment.

$largeur_origine = $info[0];
$hauteur_origine = $info[1];
$image_finale = imagecreatetruecolor($largeur_tumb, $largeur_tumb);

//on veux que l'image tienne dans un carré
if($largeur_origine>$hauteur_origine){//image "paysage"
  $x_copie = $y_copie = 0;
  $w_copie = $h_copie = $hauteur_origine;
  $x_colle = $y_colle = 0;
  $w_colle = $h_colle = $largeur_tumb;
}else{//image "portrait"
  $x_copie = $y_copie = 0;
  $w_copie = $h_copie = $largeur_origine;
  $x_colle = $y_colle = 0;
  $w_colle = $h_colle =$largeur_tumb;
}

imagecopyresized($image_finale,$image_origine,$x_colle,$y_colle, $x_copie,$y_copie,$w_colle,$h_colle,$w_copie,$h_copie);
imagecreatetruecolor() est une fonction qui crée une image blanche aux dimensions spécifiées (image temporaire). Elle va nous servir de base pour "coller" l'image finale.
Ensuite nous allons définir la zone (dans mon cas un carré) de l'image qui sera redimentionnée. Une image étant en général rectangulaire, il faut trouver le plus petit coté pour créer la zone. Un petit dessin vaut mieux qu'un long discours :
illustration du redimentionnement pour la miniature
Enfin la fonction imagecopyresized copie donc la partie carré de l'image dans l'image blanche déjà créée (l'image temporaire).
  if($info[2]==1) {
    imagegif($image_finale, "$chemin_tumb/$fichier_image");
  }else{
    if($info[2]==2){
      imagejpeg($image_finale, "$chemin_tumb/$fichier_image");
    }else{
      if($info[2]==3){
        imagepng($image_finale, "$chemin_tumb/$fichier_image");
      }
    }
  }
  imagedestroy($image_finale);
  return true;
}
?>
Ici nous copions l'image temporaire dans le répertoire de destination puis nous la supprimons.
l'appel de la fonction
donc voici comme doit se faire l'appel :
miniature($chemin_original, $chemin_tumb, $fichier_image, $taille); $chemin_original : chemin pour la grande image
$chemin_tumb : chemin de la miniature
$fichier_image : chemin du fichier d'origine
$taille : taille en px d'un coté de la miniature
Fichier source
Etant donné que ce billet est destiné aux fénéants, je vous mets directement la source pour vous evitez de faire des copier-coller :
source : gd.zip(1ko)
Pour avoir une idée d'utilisation : aperçu