Manipulation d'images en PHP - Librairie GD

Auteur: Mohamed CHINY Durée necessaire pour le cours de Manipulation d'images en PHP - Librairie GD Niveau recommandé pour le cours de Manipulation d'images en PHP - Librairie GD Supports vidéo non disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz non disponibles pour ce cours

Page 3: Créer une première image

Toutes les pages

Création et exportation d'images

Création d'une image à palette

Une image à palette est une image à couleurs indexées dont la couleur n'est pas définie directement dans les pixels constituants l'image mais dans une palette attachée à celle-ci. Ce système de palette est utilisé dans les images dont la profondeur des couleurs n'est pas importante. Par exemple les GIF peuvent supporter un maximum de 256 couleurs, dans ce cas une palette est attachée à une image GIF, et c'est elle qui contient réellement les couleurs à appliquer aux différents pixels lors de l'affichage. Ces derniers ne contiennent que les indexes de ces couleurs.

La fonction qui permet de définir les images à palette est imagecreate($largeur,$hauteur). $largeur et $hauteur sont des entiers qui représentent respectivement la largeur et la hauteur de l'image en pixels.

La fonction imagecreate() retourne un identifiant de création de l'image. Il s'agit d'une variable de type ressource et c'est elle qui sera utilisée dans le reste des fonctions qui s'appliqueront à l'image désormais créée.

La fonction imagecreate() crée une image vide (qu'on appelle aussi: espace de travail). Par conséquent, si on tente de l'afficher on aura une image noire.

Exemple:
<?php
   $img = imagecreate(400,300);
?>
Ce code permet de créer une image qui mesure 400 pixels en largeur et 300 en hauteur. L'identifiant de l'image créé est la variable $img.

Création d'une image en couleurs vraies

La fonction imagecreatetruecolor($largeur,$hauteur) permet de créer une nouvelle image en couleurs vraies. On obtient donc une image qui peut contenir plus de 16 millions de couleurs. Les variables $largeur et $hauteur désignent la largeur et la hauteur de l'image en pixels et une variable de type ressource est retournée en guise d'identifiant de l'image créée.

Exemple:
<?php
   $img = imagecreatetruecolor(400,300);
?>
Dans ce cas, nous obtenons une image en couleurs vraies (qu'on peut exporter par exemple au format JPEG ou PNG).
Dorénavant, c'est cette fonction que nous utiliserons dans le reste du cours, vue qu'elle permet de créer des images de bonne qualité.

Exporter l'image au navigateur

Afin d'afficher l'image créée à l'aide de la fonction imagecreatetruecolor() on fait appel à l'une des fonctions suivantes:
  • imagegif($img): exporte l'image $img au format GIF. Cependant cette fonction génère une image à palette, par conséquent, elle est utilisée avec imagecreate().
  • imagejpeg($img): exporte l'image $img au format JPEG.
  • imagepng($img): exporte l'image $img au format PNG.
  • ...

Personnellement, je préfère utiliser imagepng() qui exporte des images au format PNG qui est à la fois libre de droit et supporte la transparence.

Essayons le code suivant et voyons ce que ça donne:
<?php
   $img = imagecreatetruecolor(400,300);
   imagepng($img);
?>
Sur le navigateur on obtient:
‰PNG  IHDR,bÕr•tIDATxœíÁ1 õOm  þ·$?IEND®B`‚
Mais, ça ne ressemble pas à une image noire qui fait 400 sur 300 pixels!!!

A vrai dire, il est tout à fait normal d'obtenir du texte contenant des caractères bizarres suite à un code pareil. En effet, tout est question d'encodage.

Quand le navigateur envoie une requête au serveur, celui ci répond en envoyant des entêtes par défaut indiquant que le contenu qui sera retourné est du texte (en général text/html). Cependant, ce que ne navigateur reçoit n'est pas un texte mais une image. Celui-ci tente alors de sérialiser l'image en la convertissant à du texte qui a cette allure. Si l'image exportée était au format JPEG le texte à afficher serait plus bizarre encore.

La solution à ce problème consiste à expliciter les entêtes à l'aide de PHP en précisant dès le début que ce que le serveur envoie est une image au format PNG et non pas du texte.

Le code ressemblerait donc à ceci:
<?php
   header("content-type:image/png");
   $img = imagecreatetruecolor(400,300);
   imagepng($img);
?>
On obtient alors sur le navigateur le résultat suivant:
La fonction header() indique au serveur que le contenu à envoyer est une image au format PNG. Le navigateur est alors conscient qu'il doit afficher une image et non pas un texte.

En général, une page Web ne contient pas que des images, mais il y a du texte aussi. Autrement dit, supposons que l'on veut afficher le message "Bonjour" après l'image, le code serait comme ceci:
<?php
   header("content-type:image/png");
   $img = imagecreatetruecolor(400,300);
   imagepng($img);
   echo "Bonjour";
?>
Le résultat obtenu est:
Et oui, le texte ne s'affiche pas et c'est normal car les entêtes envoyées au navigateur disent bien qu'on doit afficher une image PNG et non pas du texte. Si par hasard on enlève la fonction header() du code précédent voilà ce qu'on obtient:
‰PNG  IHDR,bÕr•tIDATxœíÁ1 õOm  þ·$?IEND®B`‚Bonjour
Le texte Bonjour s'affiche bien après l'image. Cependant celle ci a été convertie en texte.

On a donc tendance à dire: soit on n'affiche que tu texte, soit on n'affiche que des images PNG. Heureusement la solution pour surmonter ce problème est très simple. En effet, au lieux d'envoyer l'image générée directement au navigateur, on va l'enregistrer sur le serveur et on l'affiche après à l'aide de la balise <img>. Brillant non? ;)

Enregistrer l'image sur le serveur

Pour enregistrer l'image sur le serveur on fait toujours appel à la fonction imagepng() (ou les autres fonctions qui exportent les autres formats). Mais cette fois ci, on ajoutera un deuxième paramètre qui représente le nom (chemin) de l'image créée.

Exemple:
<?php
   $img = imagecreatetruecolor(400,300);
   imagepng($img,"imagenoire.png");
?>
<img src="imagenoire.png" />
<?php
   echo "Bonjour";
?>
Ce qui donne:
Bonjour
Dans ce cas, plus la peine de spécifier les entêtes, car par défaut c'est text/html qui est spécifié.

Détruire une image: fonction imagedestroy()

La fonction imagedestroy($img) permet de détruire l’image créée identifiée par $img libérant ainsi la mémoire qui lui est allouée.