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.