Table des matières
Niveau
..........
En rapport...

Ecrire dans une image

Avec la librairie GD, il est possible d'écrire dans une image.
La fonction ci-dessous va vous permettre de le faire de différentes façons :

Code

php
function imageTtfTextAlign($image, $size, $angle, $x, $y, $color, $font, $text, $alpha, $outline, $Halignment, $Valignment) {
	//Ici l'ecriture du texte passe par une image virtuelle.
	//C'est pas obligatoire, on peu directement écrire dans l'image de départ
	//Mais dans ce cas pas de transparence...
 
	//créer une image virtuelle avec fond blanc (pour la transparence), avec les même dimensions que l'image de départ.
	$im = ImageCreate(imagesx($image),imagesy($image));
	$fond = ImageColorAllocate($im,255,255,255);
	ImageColorTransparent($im,$fond);
 
	//recompose la couleur du texte par rapport à la couleur hexa
	$hexcolor[0] = substr($color,0,2);
	$hexcolor[1] = substr($color,2,2);
	$hexcolor[2] = substr($color,4,2);
	$bincolor[0] = hexdec("0x{$hexcolor[0]}");
	$bincolor[1] = hexdec("0x{$hexcolor[1]}");
	$bincolor[2] = hexdec("0x{$hexcolor[2]}");
	$color=imagecolorallocate($im, $bincolor[0], $bincolor[1], $bincolor[2]);
 
	//Calcule la longueur et la largeur du texte
	$bbox = imagettfbbox ($size, $angle, $font, $text);
	$textWidth = $bbox[2] - $bbox[0]+1;
	$textHeight = $bbox[3] - $bbox[7]+1;
	//ajuste la position horizontale en fonction de l'alignement choisi
	switch ($Halignment) {
	   case "R":
		   $x -= $textWidth;
		   break;
	   case "C":
		   $x -= $textWidth;
		   $x /= 2;
		   break;
	   case "L":
		   $x = 1;
		   break;
	}  
	//ajuste la position verticale en fonction de l'alignement choisi
	switch ($Valignment) {
	   case "B":
		   $y -= $textHeight/2;
		   break;
	   case "M":
		   $y -= $textHeight;
		   $y /= 2;
		   break;
	   case "T":
		   $y = $textHeight;
		   break;
	}  
	//Si on a mis une couleur d'outline...
	if ($outline!='') {
		//recompose la couleur
		$hexcolor[0] = substr($outline,0,2);
		$hexcolor[1] = substr($outline,2,2);
		$hexcolor[2] = substr($outline,4,2);
		$bincolor[0] = hexdec("0x{$hexcolor[0]}");
		$bincolor[1] = hexdec("0x{$hexcolor[1]}");
		$bincolor[2] = hexdec("0x{$hexcolor[2]}");
		$outline=imagecolorallocate($im, $bincolor[0], $bincolor[1], $bincolor[2]);   
		//Creer un outline
		//c'est une émulation, je décale de 1px le texte dans les 4 positions possible.
		imagettftext ($im, $size, $angle, $x-1, $y, $outline, $font, $text);
		imagettftext ($im, $size, $angle, $x+1, $y, $outline, $font, $text);
		imagettftext ($im, $size, $angle, $x, $y+1, $outline, $font, $text);
		imagettftext ($im, $size, $angle, $x, $y-1, $outline, $font, $text);
	}
	//écrit le texte dans l'image
	imagettftext ($im, $size, $angle, $x, $y, $color, $font, $text);
	//Fusionne l'image virtuelle qui contient les textes avec l'image d'origine
	//Cette opération permet d'avoir la transparence du texte.
	imagecopymerge($image, $im, 0, 0, 0, 0, imagesx($image),imagesy($image), $alpha);
}
Les paramètres sont lui suivant :

  1. $image : l'image d'origine (préalablement ouverte avec gd, avec imagecreatefromjpeg par exemple)
  2. $size : la taille en px du texte a écrire
  3. $angle : l'angle de rotation du texte
  4. $x : la position du premier caractère (le coin bas-gauche du caractère)
  5. $y : la position de la ligne de base de la police, et non pas le bas des caractères
  6. $color : la couleur d'écriture (en hexadécimal, sans le #)
  7. $font : le chemin complet vers le fichier TTF à utiliser pour ecrire
  8. $text : le texte a écrire
  9. $alpha : transparence, de 0 à 100 (0 pour invisible)
  10. $outline : couleur (en hexadécimal, sans le #) de l'outline (si vide : pas d'outline)
  11. $Halignment : alignement horizontal (valeur possible : R/C/L, respectivement DROITE/CENTRE/GAUCHE). On peut laisser vide pour que $x soit utiliser tel quel pour le positionnement
  12. $Valignment : alignement vertical (valeur possible : B,M,T, respectivement BAS/MILIEU/HAUT). On peut laisser vide pour que $y soit utiliser tel quel pour le positionnement

Exemple

Voici un petit exemple pour l'utiliser :

php
//Creer le header pour le naviguateur
header ("Content-type: image/png");
$string = "coucou";
$filename='http://www.wikistuce.info/demo.jpg';
//Creer une variable image en fonction du type d'image d'origine
$ext=explode('.',$filename);
if (strtoupper($ext[count($ext)-1])=='JPG') {
	$image = imagecreatefromjpeg($filename);
}
if (strtoupper($ext[count($ext)-1])=='PNG') {
	$image = imagecreatefrompng($filename);
}
//écrit le texte a différent alignement
imagettftextalign($image,12,0,imagesx($image),imagesy($image),"FF00FF","demo.ttf",$string,80,"FFFFFF",'C','B');
 
//Creer l'image de sorti puis libère la mémoire.
imagepng($image);
imagedestroy($image);
?>
En précisant un chemin en 2eme paramètre de la fonction imagepng, vous pouvez créer une fichier sur votre serveur :

php
imagepng($image, "image.png");

Voir http://fr2.php.net/manual/fr/function.imagepng.php



02/01/2008 11:02 -

iDo –