IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[GD] Obtenir la grandeur de l'image lors de sa création


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 9
    Points : 7
    Points
    7
    Par défaut [GD] 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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");

  2. #2
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    }

  3. #3
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    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

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    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?

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'affichage d'image lors de la création du package
    Par Milyshyn76 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 17/10/2016, 11h01
  2. Image lors de la création d'un PDF
    Par Anonyme5571 dans le forum NodeJS
    Réponses: 2
    Dernier message: 27/08/2015, 10h29
  3. [Image]Vérifier taille image lors d'upload FTP
    Par MiJack dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 10/09/2004, 01h10
  4. [MX2004] redimensionner une image lors du chargement
    Par ouinouin dans le forum Flash
    Réponses: 8
    Dernier message: 18/02/2004, 18h32
  5. Réponses: 5
    Dernier message: 06/08/2002, 20h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo