Les bases de la création d'image



Voici le plan que nous allons suivre pour créer une image :

  1. nous allons découvrir ce qu'est un header ;
  2. ensuite, nous allons créer l'image de base ;
  3. enfin, nous verrons comment on affiche l'image concrètement.

Au boulot !


Le header

Il y a deux façons de générer une image en PHP.

  • Soit on fait en sorte que notre script PHP renvoie une image (au lieu d'une page web, comme on en avait l'habitude). Dans ce cas, si on va sur la page http://www.monsite.com/testgd.php, une image sera affichée et non pas une page web !
  • Soit on demande à PHP d'enregistrer l'image dans un fichier.

Dans les deux cas, on utilisera exactement les mêmes fonctions.
On va commencer par la première façon de générer l'image, c'est-à-dire qu'on va faire en sorte que notre script « renvoie » une image au lieu d'une page web.


Mais comment faire pour que le navigateur sache que c'est une image et non pas une page HTML qu'il doit afficher ?


Il va falloir envoyer ce qu'on appelle un header (un en-tête). Grâce à la fonction header, on va « dire » au navigateur que l'on est en train d'envoyer une image.

Je vous rappelle les types d'images les plus courants sur le web :

  • JPEG : c'est un format très adapté pour les photos par exemple, car on peut utiliser beaucoup de couleurs ;
  • PNG : c'est le format le plus récent, très adapté dans la plupart des cas. En fait, à moins d'avoir affaire à une photo, le mieux est d'utiliser le PNG.

Le PNG est en quelque sorte le « remplaçant » du format GIF.


Donc pour faire simple : si c'est une photo, vous faites un JPEG, sinon dans tous les autres cas vous faites un PNG.


Voici le code PHP qu'il faut mettre pour « annoncer » au navigateur que l'on va renvoyer une image PNG :

<?php

header ("Content-type: image/png");

?>

Voilà, c'est assez simple. Ce code signifiera pour le navigateur que l'on envoie une image PNG, et non pas une page HTML.


Si vous envoyez un JPEG, c'est presque pareil, mais vous remplacez le « png » par « jpeg ».

La fonction header est particulière. Comme setcookie, elle doit être utilisée avant d'avoir écrit le moindre code HTML.
En clair, mettez cette ligne au tout début de votre code, et vous n'aurez pas de problèmes.


Créer l'image de base

Il faut savoir qu'il y a deux façons de créer une image : soit vous créez une nouvelle image vide, soit vous chargez une image qui existe déjà et qui servira de fond à votre nouvelle image.


À partir d'une image vide

On va commencer par créer une image vide.
Pour créer une image vide en PHP, on utilise la fonction imagecreate.


Cette fonction est simple. Elle prend deux paramètres : la largeur et la hauteur de l'image que vous voulez créer. Elle renvoie une information que vous devez mettre dans une variable (par exemple $image). Ce qui nous donne :

<?php

header ("Content-type: image/png");

$image = imagecreate(200,50);

?>


Ici, nous sommes en train de créer une image de 200 pixels de large et 50 pixels de haut.


$image ne contient ni un nombre, ni du texte. Cette variable contient une « image ». C'est assez difficile à imaginer qu'une variable puisse « contenir » une image, mais c'est comme ça.

On dit que $image est une « ressource ». Une ressource est une variable un peu spéciale qui contient toutes les informations sur un objet. Ici, il s'agit d'une image, mais il pourrait très bien s'agir d'un PDF ou même d'un fichier que vous avez ouvert avec fopen. Tiens, tiens, ça vous rappelle quelque chose ?


À partir d'une image existante


Maintenant, l'autre possibilité : créer une image à partir d'une image déjà existante.
Cette fois, il y a deux fonctions à connaître. Laquelle choisir ? Ça dépend du format de l'image que vous voulez charger :

  • JPEG : il faut utiliser la fonction imagecreatefromjpeg ;
  • PNG : il faut utiliser la fonction imagecreatefrompng.


Par exemple, j'ai une jolie photo de coucher de soleil qui s'appelle couchersoleil.jpg (figure suivante).



Ma photo couchersoleil.jpg



Pour créer une nouvelle image en se basant sur celle-là, je dois utiliser la fonction imagecreatefromjpeg. Ça nous donnerait le code suivant :

<?php

header ("Content-type: image/jpeg");

$image = imagecreatefromjpeg("couchersoleil.jpg");

?>

Voilà, vous savez créer une nouvelle image.


Nous allons maintenant voir comment afficher l'image que vous venez de créer.


Quand on a terminé : on affiche l'image

Une fois que vous avez chargé l'image, vous pouvez vous amuser à y écrire du texte, à dessiner des cercles, des carrés, etc. Nous allons apprendre tout cela juste après.

Je souhaite vous montrer ici comment faire pour dire à PHP qu'on a fini et qu'on veut afficher l'image.

La fonction à utiliser dépend du type de l'image que vous êtes en train de créer :

  • JPEG : il faut utiliser la fonction imagejpeg ;
  • PNG : il faut utiliser la fonction imagepng.


Ces deux fonctions s'utilisent de la même manière : vous avez juste besoin d'indiquer quelle image vous voulez afficher.

Comme je vous le disais, il y a deux façons d'utiliser les images en PHP : vous pouvez les afficher directement après les avoir créées, ou les enregistrer sur le disque pour pouvoir les ré-afficher plus tard, sans avoir à refaire tous les calculs.


Afficher directement l'image


C'est la méthode que l'on va utiliser dans ce chapitre. Quand la page PHP est exécutée, elle vous affiche l'image que vous lui avez demandé de créer.
Vous avez toujours votre variable $image sous la main ? Parfait. ;-)


Alors voici le code complet que j'utilise pour créer une nouvelle image PNG de taille 200 imes 50 et l'afficher directement :

<?php

header ("Content-type: image/png"); // 1 : on indique qu'on va envoyer une image PNG

$image = imagecreate(200,50); // 2 : on crée une nouvelle image de taille 200 x 50

// 3 : on s'amuse avec notre image (on va apprendre à le faire)

imagepng($image); // 4 : on a fini de faire joujou, on demande à afficher l'image

?>


C'est bien joli, mais là on n'a qu'une image sous les yeux. Et si je veux mettre du texte autour ? Les menus de mon site ?


En fait, on utilise une technique qui, j'en suis sûr, va vous surprendre. On va demander à afficher la page PHP comme une image

.
Donc, si la page PHP s'appelle « image.php », vous mettrez ce code HTML pour l'afficher depuis une autre page :

<img src="image.php" />


Incredible, isn't it?


Mais en fait, c'est logique quand on y pense ! La page PHP que l'on vient de créer EST une image (puisqu'on a modifié le header). On peut donc afficher l'image que l'on vient de créer depuis n'importe quelle page de votre site en utilisant simplement la balise <img />.
Le gros avantage de cette technique, c'est que l'image affichée pourra changer à chaque fois !


Enregistrer l'image sur le disque


Si, au lieu d'afficher directement l'image, vous préférez l'enregistrer sur le disque, alors il faut ajouter un paramètre à la fonction imagepng : le nom de l'image et éventuellement son dossier. Par contre, dans ce cas, votre script PHP ne va plus renvoyer une image (il va juste en enregistrer une sur le disque). Vous pouvez donc supprimer la fonction header qui ne sert plus à rien.


Ce qui nous donne :

<?php

$image = imagecreate(200,50);

// on fait joujou avec notre image

imagepng($image, "images/monimage.png"); // on enregistre l'image dans le dossier "images"

?>


Cette fois, l'image a été enregistrée sur le disque avec le nom monimage.png. Pour l'afficher depuis une autre page web, vous ferez donc comme ceci :

<img src="images/monimage.png" />

Ça, vous avez un peu plus l'habitude, j'imagine.


Cette technique a l'avantage de ne pas nécessiter de recalculer l'image à chaque fois (votre serveur aura moins de travail), mais le défaut c'est qu'une fois qu'elle est enregistrée, l'image ne change plus.


Mais… mais ? Si je teste ces codes, ça crée une image toute blanche ! C'est nul, il ne s'est rien passé de bien !


Oui, je sais. Vous avez été patients et c'est bien, parce que c'est maintenant que ça va devenir intéressant. Allez donc chercher votre baguette magique, je vous attends.

Créé avec HelpNDoc Personal Edition: Modifiez et exportez sans effort des documents Markdown