Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images > GD
GD Forum d'entraide pour l'extension GD permettant de manipuler des images en PHP. Avant de poster -> tutoriels GD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/03/2007, 19h47   #1
Invité de passage
 
Inscription : octobre 2002
Messages : 9
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 9
Points : 3
Points : 3
Par défaut Obtenir la grandeur de l'image lors de sa création

En ce moment j'essaie de créer une image qui a du texte dedans avec une police spécial. En ce moment, je mets une grandeur fixe de l'image, mais à vrai dire, je veux juste que la grandeur de l'image s'ajuste à la grandeur de texte. J'essaie de voir quel fonctionnalité qui me permet de faire ça et je ne le voie pas. Est-ce que vous pouvez m'aider?

Voici mon code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
function creer_image($text,$font,$fonSize,$textColor,$background)
{
    header("Content-type: image/png");
 
 
    ### Coverti la couleur html du background en couleur RGB
    if( eregi( "([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $background, $bgrgb ) )
    {$bgred = hexdec( $bgrgb[1] );   $bggreen = hexdec( $bgrgb[2] );   $bgblue = hexdec( $bgrgb[3] );}
 
    ### Coverti la couleur html du texte en couleur RGB
    if( eregi( "([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $textColor, $textrgb ) )
    {$textred = hexdec( $textrgb[1] );   $textgreen = hexdec( $textrgb[2] );   $textblue = hexdec( $textrgb[3] );}
 
    ### Crée l'image
    $im = imagecreate(200, 16);
 
    ### Couleur du Background
    $bgcolor = imagecolorallocate($im, $bgred,$bggreen,$bgblue);
 
    ### Couleur du texte
    $fontcolor = imagecolorallocate($im, $textred,$textgreen,$textblue);
 
 
    # Couleur de fond
    imagefilledrectangle($im, 0, 0, $text_width, $text_height, $bgcolor);
 
     // Ajout du texte
    imagettftext($im, $fonSize, 0, 10, 13, $fontcolor, $font, $text);
 
    // Utiliser imagepng() donnera un texte plus claire,
    // comparé à l'utilisation de la fonction imagejpeg()
    imagepng($im);
    imagedestroy($im);     
}
 
creer_image("test de mon image","CHALCDGN.TTF",10,"FFFFFF","003399");
anny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 02h17   #2
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
imagettftext() retourne aussi les coordonnées en pixels des 4 points du rectangle nécessaire pour afficher le texte. l'idée est donc de créer une image pour pouvoir calculer la hauteur et la largeur nécessaires.

Code :
1
2
3
4
 
    $bounds=imagettftext($im, $fonSize, 0, 0, 0, $fontcolor, $font, $text);
    $text_width=abs($bounds[4]-$bounds[0])+4;
    $text_height=abs($bounds[5]-$bounds[1])+4;
il y a en tout 4 X et 4 Y, mais seulement 2 X et 2 Y sont nécessaires pour calculer largeur et hauteur, l'ajout de 4 pixels est pour avoir 2 pixels de bordure autour du texte.

ensuite il faut détruire l'image pour la recréer avec la largeur et la hauteur calculées. après la couleur de fond, il faut finalement afficher le texte. en horizontal c'est pas difficile puisque c'est 2 (la bordure de 2 pixels autour du texte).

par contre en vertical c'est un peu + compliqué, d'abord il y a le fait que le point 0 est en bas et pas en haut ensuite la police de caractère s'affiche selon sa ligne de base qui lui ait propre... par exemple les lettres "dg" le point le + bas de "d" est la ligne de base, donc il dois y avoir un déplacement vertical pour correctement afficher la lettre "g". heureusement le premier imagettftext a retourné la bonne valeur dans $bounds[1] (le premier Y) qu'il suffit de soustraire à la hauteur de l'image... -2 aussi pour la jolie bordure de 2 pixels.

avec ces quelques petites modifications tout devrait correctement fonctionner, j'ai testé un peu aussi

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
function creer_image($text,$font,$fonSize,$textColor,$background)
{
    header("Content-type: image/png");
 
    ### Coverti la couleur html du background en couleur RGB
    if( eregi( "([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $background, $bgrgb ) )
    {$bgred = hexdec( $bgrgb[1] );   $bggreen = hexdec( $bgrgb[2] );   $bgblue = hexdec( $bgrgb[3] );}
 
    ### Coverti la couleur html du texte en couleur RGB
    if( eregi( "([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $textColor, $textrgb ) )
    {$textred = hexdec( $textrgb[1] );   $textgreen = hexdec( $textrgb[2] );   $textblue = hexdec( $textrgb[3] );}
 
    ### Crée une image temporaire
    $im = imagecreate(200, 16);
 
    // Calculer la taille du texte
    $fontcolor = imagecolorallocate($im, $textred,$textgreen,$textblue);
    $bounds=imagettftext($im, $fonSize, 0, 0, 0, $fontcolor, $font, $text);
    $text_width=abs($bounds[4]-$bounds[0])+4;
    $text_height=abs($bounds[5]-$bounds[1])+4;
 
    // recréer l'image pour contenir le texte
    imagedestroy($im);
    $im = imagecreate($text_width, $text_height);
 
    ### Couleur du Background
    $bgcolor = imagecolorallocate($im, $bgred,$bggreen,$bgblue);
 
    ### Couleur du texte
    $fontcolor = imagecolorallocate($im, $textred,$textgreen,$textblue);
 
    # Couleur de fond
    imagefilledrectangle($im, 0, 0, $text_width, $text_height, $bgcolor);
 
    // afficher le texte
    imagettftext($im, $fonSize, 0, 2, $text_height-abs($bounds[1])-2, $fontcolor, $font, $text);
 
    // Utiliser imagepng() donnera un texte plus claire,
    // comparé à l'utilisation de la fonction imagejpeg()
    imagepng($im);
    imagedestroy($im);
}
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 02h48   #3
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Citation:
imagettftext() retourne aussi les coordonnées en pixels des 4 points du rectangle nécessaire pour afficher le texte.
Il y a beaucoup plus simple :
Citation:
Envoyé par DocPHP
array imagettfbbox ( float size, float angle, string fontfile, string text )



imagettfbbox() calcule et retourne le rectangle entourant le texte text, écrit avec une police truetype.
size La taille de la police en pixel.
angle L'angle en degrès dans lequel le paramètre text sera mesuré.
fontfile Le nom de la police TrueType (peut être une URL). Suivant la version de la bibliothèque GD utilisée par PHP, ce paramètre peut chercher des fichiers qui ne commence pas par un slash ("/") de fin mais plutôt .ttf et cherchera tout le long des chemins de fonts définis.
text La chaîne à mesurer.

imagettfbbox retourne un tableau avec 8 éléments représentant les 4 sommets du rectangle ainsi défini.
0Coin inférieur gauche, abscisse
1Coin inférieur gauche, ordonnée
2Coin inférieur droit, abscisse
3Coin inférieur droit, ordonnée
4Coin supérieur droit, abscisse
5Coin supérieur droit, ordonnée
6Coin supérieur gauche, abscisse
7Coin supérieur gauche, ordonnée
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 19h35   #4
Invité de passage
 
Inscription : octobre 2002
Messages : 9
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 9
Points : 3
Points : 3
Merci bien gros

Je vais aller plus avec la solution à Daniel61, car j'ai essayé avec imagettfbbox() et ça donnait pas le résultat que je voulais avoir. Je ne sais pas pourquoi, mais ma boîte devient trop petite. Est-ce à cause de la version de gd?
anny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2009, 15h08   #5
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Le script proposé fonctionne bien, toute fois, il reste un problème sur l'alignement horizontale. Avec une petite police (13) le problème n'est pas visible, mais avec une police de grandeur 60, on voit qu'il y a un décalage vers la droite et en somme cela tronque le texte.
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h42.


 
 
 
 
Partenaires

Hébergement Web