Programmation PHP/Images
Introduction
modifierPHP peut créer et modifier dynamiquement des images, par exemple avec la bibliothèque GD, inclue depuis PHP 3.0.
La création d'une nouvelle image se déroule généralement ainsi :
- Chargement en mémoire d'une image, nouvelle ou existante.
- Chargement éventuel des couleurs à y apporter.
- Modifications éventuelles de ses composants (création de lignes, points, remplissages, ajout de textes...).
- Restitution de l'image après avoir posté son type dans l'en-tête.
- Libération mémoire.
Créer une nouvelle image
modifierPour créer une image ex-nihilo, on utilise la fonction :
imagecreatetruecolor($hauteur, $largeur)
qui crée en mémoire une nouvelle image de hauteur et largeur définies en pixel, et restitue une référence à l'image crée.
Il existe aussi une autre fonction pour cela, mais elle n'est pas recommandée car son amplitude de couleurs est moindre[1] :
imagecreate($largeur, $hauteur)
Pour charger en mémoire une image sauvegardée sur le disque :
imagecreatefrom<type>($chemin)
Exemple :
$img = imagecreatefrompng('image.png');
Autre fonction :
imagecreatefromstring($texte)
qui crée une image à partir de son format texte, spécifié en paramètre.
S'il survient une erreur, ces fonctions renvoient false
.
Travailler avec les couleurs
modifierPour allouer une couleur il faut en définir les paramètres RVB :
$couleur = imagecolorallocate($image, $r, $v, $b)
Pour définir une transparence dans un PNG :
imagecolortransparent($image, $couleur)
où $couleur
est le résultat de imagecolorallocate
.
Il est également possible de déterminer la transparence, comprise entre 0 et 127 (qui représente la transparence totale) à l'aide de la fonction :
imagecolorallocatealpha($image, $r, $v, $b, $transparence)
Sinon, un fond transparent peut également être assuré par les deux fonctions ci-dessous :
imageAlphaBlending($image, false);
imageSaveAlpha($image, true);
Une fois l'image créée et colorisée, on peut y appliquer les opérations :
- Dessiner des pixels (ex : créer des lignes).
- Travailler sur les pixels existants en désignant des zones.
Dessiner des formes
modifierPour dessiner un pixel, on utilise ses coordonnées (x, y ci-dessous) :
imagesetpixel(image, x, y, couleur)
Pour tracer une ligne entre deux points :
imageline(image, x1, y1, x2, y2, couleur)
Pour créer un rectangle par sa diagonale :
imagerectangle(image, x1, y1, x2, y2, couleur)
Pour représenter une ellipse par son centre, sa hauteur et sa largeur :
imageellipse(image, x, y, h, l, couleur)
ou en précisant son arc par ses angles en gradient (numérotés dans le sens horaire) :
imagearc(image, x, y, h, l, angle1, angle2, couleur)
Retravailler les pixels existants
modifierUne des fonctions les plus utilisées pour retravailler des images comme des photos, est certainement imagecopyresized
, qui permet de copier une zone rectangulaire pour la coller dans une autre image[2]. Exemple :
imagecopyresized(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h);
où :
src_image
est l'image source ;dst_image
est l'image de destination ;dst_x, dst_y
sont les coordonnées dedst_image
;src_x, src_y
sont les coordonnées desrc_image
en partant d'en haut à gauche ;dst_w, dst_h, src_w, src_h
sont les largeurs et hauteurs des rectangles de source et destination.
On peut ensuite comprendre que si dst_w
est égal à src_w
, et dst_h
à src_h
, la portion rectangulaire de l'image restera de la même taille. Dans le cas contraire on allonge ou on élargit.
La fonction imagecopyresampled
reçoit les mêmes paramètres que imagecopyresized
, mais avec la différence que, en cas de redimensionnement, la qualité est améliorée.
Puis il existe la fonction imagefilter
, qui permet de nombreux effets tels que les niveaux de gris, le relief, ou la recoloration[3].
Imprimer l'output
modifierLe format de l'image obtenue ("png", "jpeg" ou "gif") peut être spécifié par la fonction header
, via le content-type (par défaut text/html) ainsi :
header("Content-type: image/<type>");
Pour visualiser l'image ensuite, la placer en paramètre dans une fonction dépendant de son type : imagepng
, imagejpeg
ou imagegif
.
Puis, libérer la mémoire avec imagedestroy($image)
. Cette étape facultative est particulièrement recommandée pour les images volumineuses.
Exemple
modifierLe code suivant affiche dans le navigateur, un carré rouge de 50 pixels dans un noir de 100.
$image = imagecreatetruecolor(100, 100);
$couleur = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image,0,0,50,50,$couleur);
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);