La bibliothèque GD permet de générer des images dynamiquement en PHP. Je détaille dans cet article quelles fonctions j'utilise pour écrire un texte dans une image, en gérant la taille de police et son positionnement.
Avant toute chose, vérifiez que la bibliothèque GD est installée sur votre serveur, pour savoir cela, vous pouvez faire un phpinfo(), (vous pouvez créer un petit fichier PHP contenant un appel à la fonction phpinfo() ), vous devez trouver quelque chose comme GD Support : Enabled (Depuis la version 2.0, le format GIF n'est plus supporté, il a été remplacé par le format PNG...)
Naturellement, j'ai d'abord cherché à utiliser la fonction imagestring mais elle ne permet (apparemment) pas de gérer la taille de la police, je me suis donc tourné vers la fonction imagettftext. Avant d'utiliser cette fonction, vous pouvez faire appel à la fonction imageftbbox pour calculer la largeur exacte du texte avec la taille de police définie. En résumé, je propose ci-dessous un extrait de script qui permet : à la fois de gérer la taille de police et de positionner au mieux le texte (le centrer dans cet exemple) en calculant au préalable sa largeur (width) :
// INFO : Convert color from hex in XXXXXX (eg. FFFFFF, 000000, FF0000) to array(R, G, B) / fonction détaillée plus bas dans le script $array_color_titre = rgb2array($color_titre);
// INFO : imagecolorallocate : Retourne un identifiant de couleur, représentant la couleur composée avec les couleurs RGB. $ref_couleur_titre = imagecolorallocate($cropped_image, $array_color_titre[0], $array_color_titre[1], $array_color_titre[2]);
// La fonction ci-dessous ne permet apparement pas de gérer la taille de police... Ni de gérer le centrage... // INFO bool imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color ) //imagestring($cropped_image, 5, $largeur_bordure, $cropHeight+$largeur_bordure, $texte_titre, $ref_couleur_titre);
// On définit la police $filename_font = "GenR102.TTF";
// On définit la taille de police $font_size = 20;
// On calcule la largeur du Texte // INFO : array imageftbbox ( float $size , float $angle , string $fontfile , string $text [, array $extrainfo ] ) $array_positions = imageftbbox( $font_size, 0, $filename_font, $texte_titre); $spacepx = $array_positions[4] - $array_positions[0];
// On écrit le Texte au centre grâce à la variable $spacepx calculée ci-dessus // INFO : array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text ); imagettftext($cropped_image, $font_size, 0, $largeur_bordure+$cropWidth/2-$spacepx/2, $cropHeight+$largeur_bordure+$largeur_bordure/2, $ref_couleur_titre, $filename_font, $texte_titre);
/** * Convert color from hex in XXXXXX (eg. FFFFFF, 000000, FF0000) to array(R, G, B) * of integers (0-255). */ function rgb2array($rgb) { return array( base_convert(substr($rgb, 0, 2), 16, 10), base_convert(substr($rgb, 2, 2), 16, 10), base_convert(substr($rgb, 4, 2), 16, 10), ); }
// generate cropped image ob_start(); imagejpeg($cropped_image, NULL, $imageQuality); $contents = ob_get_contents(); ob_end_clean();
// Nom final de la nouvelle image $saveAs = $process_dir . $fileName; // On écrit la nouvelle image $file = fopen($saveAs, "w"); fwrite($file, $contents); fclose($file);
|