Introduction

modifier

PHP 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 :

  1. Chargement en mémoire d'une image, nouvelle ou existante.
  2. Chargement éventuel des couleurs à y apporter.
  3. Modifications éventuelles de ses composants (création de lignes, points, remplissages, ajout de textes...).
  4. Restitution de l'image après avoir posté son type dans l'en-tête.
  5. Libération mémoire.

Créer une nouvelle image

modifier

Pour 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

modifier

Pour 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)

$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)
 la première couleur allouée définit le fond de toute l'image.

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

modifier

Pour 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

modifier

Une 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 de dst_image ;
  • src_x, src_y sont les coordonnées de src_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

modifier

Le 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

modifier

Le 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);

Références

modifier