1. Ouvrir l'image

Les fonctions s'appliquant aux images demandent une ressource (resource en anglais) qui est un type particulier de variable. Attention à bien nommer vos variables, pour passer le bon type aux fonctions !

// Déterminer l'extension à partir du nom de fichier
$extension = substr( $img_src_chemin, -3 );
// Afin de simplifier les comparaisons, on met tout en minuscule
$extension = strtolower( $extension );
Ouvrir l'image avec la fonction appropriée en fonction de l'extension :

switch ( $extension ) {

case "jpg":
case "peg": //pour le cas où l'extension est "jpeg"
$img_src_resource = createimagefromjpeg( $img_src_chemin );
break;

case "gif":
$img_src_resource = createimagefromgif( $img_src_chemin );
break;

case "png":
$img_src_resource = createimagefrompng( $img_src_chemin );
break;

// On peut également ouvrir les formats wbmp, xbm et xpm (vérifier la configuration du serveur)

default:
echo "L'image n'est pas dans un format reconnu. Extensions autorisées : jpg/jpeg, gif, png";
break;
}

Pour ouvrir une image, il faut passer par une fonction dont le nom commence par create. Pensez ce que vous voulez, mais pour moi c'est tout sauf intuitif...

2. Créer l'image de destination

Il n'est pas recommandé de modifier directement l'image sur laquelle vous travaillez, il nous faut donc créer une ressource vide, dans laquelle sera enregistré le flux (stream) contenant l'image modifiée. Il est également recommandé de créer une ressource en mode "couleurs réelles". Cela évite que les recalculs soient limités par une palette de 255 couleurs et permet d'obtenir un bien meilleur rendu.


//Pour créer une image de destination de 100 pixels de large sur 200 de haut
$img_dst_resource = imagecreatetruecolor( 100, 200 );

3. Redimensionner

Deux fonctions permettent de redimensionner une image, imagecopyresized et imagecopyresampled. La première est plus rapide mais moins précise et donne un résultat moins fin. Toutes deux demandent les 10 paramètres suivants :

  1. L'image de destination (une ressource, pas un chemin),
  2. L'image d'origine (une ressource aussi),
  3. Les coordonnées horizontales du point où commencer l'écriture,
  4. Les coordonnées verticales du point où commencer l'écriture,
  5. Les coordonnées horizontales du point où commencer la lecture,
  6. Les coordonnées verticales du point où commencer la lecture,
  7. La largeur de l'image de destination,
  8. La hauteur de l'image de destination,
  9. La largeur de l'image d'origine,
  10. La hauteur de l'image d'origine.

Pour recopier une image sans décalage, mettre 0 pour les paramètres 3 à 6.

Les dimensions d'une image peuvent s'obtenir à l'aide des fonctions imagesx() et imagesy(), ou encore par getimagesize(). Les deux premières fonctions demandent une ressource, la dernière en revanche demande une chaîne de texte contenant le chemin de l'image.


// Exemple avec imagesx() et imagesy()
$img_src_width = imagesx( $img_src_ressource );
$img_src_height = imagesy( $img_src_ressource );

// Exemple avec getimagesize()
// getimagesize renvoie un tableau
// Ce tableau contient la largeur, la hauteur, un entier représentant le type d'image, et
// une chaîne width/height pouvant être insérée dans une balise img.
// Je vous laisse lire la documentation pour les détails techniques
list( $img_src_width, $img_src_height ) = getimagesize($img_src_chemin);

4. Enregistrer l'image modifiée

Le plus dur est fait, il ne reste plus qu'à enregistrer le flux contenant l'image redimensionnée. Si vous avez déjà travaillé avec des fichiers en PHP, désolé mais ça ne vous avancera pas beaucoup. En effet, on ne peut pas enregistrer telle quelle une ressource image, il faut utiliser une fonction particulière, en fonction du type d'image souhaité.


// Vérifions tout d'abord que nous pouvons enregistrer le fichier
$handle = fopen( $img_dst_chemin, "w" );
if ( !$handle ) {
echo "Impossible d'écrire l'image. Vérifiez le chemin, et les droits du serveur.";
exit;
}
fclose( $handle );

// Pour enregistrer au format jpg
imagejpeg( $img_dst_ressource, $img_dst_chemin );
// Un troisième argument, facultatif, est la qualité. Elle est de 75 par défaut.

// Pour enregistrer au format png
imagepng( $img_dst_ressource, $img_dst_chemin );

// Pour enregistrer au format gif
imagegif( $img_dst_ressource, $img_dst_chemin );

// Pour enregistrer au format wbmp
imagewbmp( $img_dst_ressource, $img_dst_chemin );

Et voilà ! J'ai rassemblé tout le code dans un fichier (redimensionner.phps, en pièce jointe) mais je vous laisse l'adapter, c'est la meilleure façon d'apprendre.