Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajout d'une police sur une image avec GD - PHP

Création d'une image grâce à PHP.

    30 avril 2022 à 12:27:11

    Bonjour,

    Je me suis lancer dans la réalisation de la création d'une image avec PHP. Photoshop c'est bien, mais ça deviens vite long quand il faut modifier plusieurs images avec les mêmes paramètres.

    Le script fonctionne à merveille à un détail prêt. La police que j'aimerais ne veut pas s'ajouter à mon image et ça peut importe ce que j'utilise

    $font = imageloadfont ('../fonts/Lobster.ttf'); Ne marche pas.

    $font = '../fonts/Lobster.ttf'; Ne fonctionne pas non plus.

    La police de base et trop petite pour ce que j'aimerais faire te n'est pas à mon goût. Pour voir un plein contrôle sur le texte, j'utilise a formule : imagettftext. Mais même avec ça, ça ne fonctionne pas. Pouvez-vous m'aider s'il vous plait ?

    Le Code :

    <?php
    
    // Transformation de du PHP en Image
    header("Content-type: image/png");
    
    // Récupertion du texte
    $string = $_GET['text'];
    
    // Création de l'image à partir d'une image déjà faite
    $img     = imagecreatefrompng("../png/Character_" . $string . "_Card.png");
    
    // Couleur du texte (Blanc)
    $couleur = imagecolorallocate($img, 255, 255, 255);
    
    // Couleur de fond du rectangle
    $type = imagecolorallocate($img, 128, 126, 76); // Couleur Geo
    imagefilledrectangle($img, 0, 1600, 1000, 1778, $type);
    
    // Rectangle
    imagesetthickness($img, 10);
    imagerectangle($img, 5, 1600, 994, 1772, $couleur);
    
    // Definition de l'emplacement du texte
    // $px     = 250 + $strx/2; // Largeur
    
    // Fonction pour déterminer le centrage de la chaine de caractères (elle prend comme paramètre : la chaine et la police d'écriture
    function centrage_texte($z,$y)
    {
    		// Je calcule le nombre de caractères dans la chaine
    	$a = strlen($z);
    		// Je calcule la taille d'un caractère par rapport à la taille de la police
    	$b = imagefontwidth($y);
    		// Je calcule la taille de ma chaine de caractères		
    	$c = $a*$b;
    		// Je calcule combien il me reste de caractères/espace sur les côtés pour centrer mon texte
    	$d = 1000-$c;
    		// Je recherche l'emplacement où débutera ma chaine de caractères
    	$e = $d/2;	
    		// La chaine commencera ... à cet emplacement	
    	return $e;		
    }
    
    
    $font = '../fonts/Lobster.ttf';
    imagettftext($img, 14, 0, centrage_texte($string,5), 1670, $couleur, $font, $string);
    
    // Afficher l'image ...
    imagepng($img);
    
    // ... puis la détruire
    imagedestroy($img);
    ?>        

    Je confirme que le chemin vers la police est bien le bon. J'ai cherché un peu partout sur internet mais rien ne fonctionne. Le problème viens peut-être de la police, je ne sais pas.

    Merci par avance !

    • Partager sur Facebook
    • Partager sur Twitter
      1 mai 2022 à 8:52:04

      Bonjour

      On dirait que cette fonction ne marche qu'avec les .gdf, ta police est .ttf

      Y'a des convertisseurs en ligne: Convertir TTF en DFONT (En ligne et Gratuit) — Convertio

      -
      Edité par Asmitta 1 mai 2022 à 8:53:18

      • Partager sur Facebook
      • Partager sur Twitter
        1 mai 2022 à 16:23:57

        Hey,

        Merci beaucoup pour ta réponse !

        Je viens d'essayer de convertir la police .ttf en .dfont comme tu l'as indiqué au dessus et malheureusement, le problème est toujours présent. C'est assez embêtant. Le problème ne viendrait-il pas du fichier php.ini du serveur WAMP ?

        En effet, je viens de voir que la formule nécessite l'extension appeler "freetype" malheureusement, je ne trouve pas comment faire pour l'ajouter sur WAMP.

        Toute aide sera la bienvenue et je vous en remercie par avance !

        -
        Edité par Frédérick1718 1 mai 2022 à 18:13:05

        • Partager sur Facebook
        • Partager sur Twitter
          2 mai 2022 à 0:20:59

          Selon PHP: Installation - Manual,

          To enable GD-support configure PHP --with-gd[=DIR], where DIR is the GD base install directory. To use the recommended bundled version of the GD library, use the configure option --with-gd. GD library requires libpng and libjpeg to compile. As of PHP 7.4.0, --with-gd becomes --enable-gd (whether to enable the extension at all) and --with-external-gd (to opt into using an external libgd, rather than the bundled one). In Windows, you'll include the GD DLL php_gd.dll as an extension in php.ini. Prior to PHP 8.0.0, the DLL was named php_gd2.dll.

          Cherche ces fichiers dll et tu installes.

          • Partager sur Facebook
          • Partager sur Twitter
            2 mai 2022 à 10:49:35

            L'extension php_gd2.dll est déjà installé, sinon je ne pourrai pas du tout afficher l'image ..

            Mais j'ai beau chercher ce FreeType, je ne le trouve pas. Je l'ai téléchargé sur mon ordinateur, mais je ne sais pas vraiment où le mettre et ce qu'il faut faire de plus pour que le fichier soit pris en compte

            • Partager sur Facebook
            • Partager sur Twitter
              3 mai 2022 à 3:45:37

              php_gd2.dll => Freetype 2.

              Donc Tu as déjà Freetype.

              Rassure toi en faisant un phpinfo()

              -
              Edité par Asmitta 3 mai 2022 à 5:57:07

              • Partager sur Facebook
              • Partager sur Twitter
                4 mai 2022 à 9:02:33

                Et bien phpinfo() ne me retourne aucune erreur.. mais sur la page, il y a seulement marquer que l'image ne peux pas être renvoyé car elle contient des erreurs. J'aimerais bien savoir où est l'erreur justement mdr. Mais malheureusement, je dois chercher par moi-même. Je sais que l'erreur viens forcément de quelque chose qui est lier à la police donc soit $font soit imagettftext/imagettftext. Je ne vois pas d'autre solution malheureusement

                -
                Edité par Frédérick1718 4 mai 2022 à 9:02:50

                • Partager sur Facebook
                • Partager sur Twitter
                  4 mai 2022 à 12:46:11

                  Salut

                  Tu devrais pouvoir lire le message d'erreur en commentant temporairement l'instruction header(…); du début de ton code.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 mai 2022 à 21:28:46

                    Bonjour,

                    Je me suis trouvé confronté au même probléme il y a peu et je l'ai solutionné en utilisant realpath() de façon à ce que le script trouve bien la ressource.voir https://www.php.net/manual/fr/function.realpath.php si tu ne connaissais pas encore ;)

                    Mon script génère des epubs et je créer à la volée les images de couverture avec GD, je tri donc mes fonts en deux groupes : ttf et otf pour la couverture généré via la librairie GD et otf,woff,woff2 pour l'epub. Je me sert du même convertisseur que Asmitta t'as indiqué .

                    Les font ttf et otf ne me posent aucun probléme et mon script tourne aussi bien sous PHP 7+ que 8+

                    Cdt

                    P.S. As tu vérifier les coordonnées de function centrage_texte($z,$y) et qu'elles sont bien dans l'image ?

                    -
                    Edité par gc-nomade 4 mai 2022 à 21:32:35

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Quelques ressources pour PluXml, CMS Français sans BDD (XML) github : repos Github amateur, pas dev

                      20 mai 2022 à 8:15:58

                      Bonjour a tous, un grand merci pour vos réponse malheureusement, ça ne fonctionne toujours pas. On a déjà fait un grand pas en avant avec cette erreur. Il ne détecte pas la police.

                      Voici l'erreur :

                      Je vais vous montrer le code actuel, peut-être que vous trouverez l'erreur là ou moi je ne la vois pas ..

                      <?php
                      
                      // Transformation du PHP en Image
                      header("Content-type: image/png");
                      
                      // Récupertion du texte
                      $string = $_GET['text'];
                      
                      // Création de l'image à partir d'une image déjà faite
                      $img     = imagecreatefrompng("../png/Character_" . $string . "_Card.png");
                      
                      // Couleur du texte (Blanc)
                      $couleur = imagecolorallocate($img, 255, 255, 255);
                      
                      // Couleur de fond du rectangle
                      $type = imagecolorallocate($img, 128, 126, 76); // Couleur Geo
                      imagefilledrectangle($img, 0, 1600, 1000, 1778, $type);
                      
                      // Rectangle
                      imagesetthickness($img, 10);
                      imagerectangle($img, 5, 1600, 994, 1772, $couleur);
                      
                      // Definition de l'emplacement du texte
                      // $px     = 250 + $strx/2; // Largeur
                      
                      // Fonction pour déterminer le centrage de la chaine de caractères (elle prend comme paramètre : la chaine et la police d'écriture
                      function centrage_texte($z,$y)
                      {
                      		// Je calcule le nombre de caractères dans la chaine
                      	$a = strlen($z);
                      		// Je calcule la taille d'un caractère par rapport à la taille de la police
                      	$b = imagefontwidth($y);
                      		// Je calcule la taille de ma chaine de caractères		
                      	$c = $a*$b;
                      		// Je calcule combien il me reste de caractères/espace sur les côtés pour centrer mon texte
                      	$d = 1000-$c;
                      		// Je recherche l'emplacement où débutera ma chaine de caractères
                      	$e = $d/2;	
                      		// La chaine commencera ... à cet emplacement	
                      	return $e;		
                      }
                      
                      $apl_form = centrage_texte($string, 5);
                      
                      echo realpath('C:\wamp64\\') . PHP_EOL;
                      echo realpath('/www/Card_GI-PHP/fonts/') . PHP_EOL;
                      
                      $font_family = './arial.ttf';
                      imagettftext($img, 5, 0, $apl_form, 1670, $couleur, $font_family, $string);
                      
                      // Afficher l'image ...
                      imagepng($img);
                      
                      // ... puis la détruire
                      imagedestroy($img);
                      ?>

                       Voici également le chemin vers le font ainsi que le chemin de là ou se trouve la page php :

                      Fonts :      PHP :

                      J'ai retiré le Header c'est donc pour ça que j'ai pu avoir l'erreur, Merci Ymox.

                      Ensuite, pour réponde à ta question gc-nomade, les tailles font bien parti de l'image puisque quand le font par défaut est mis, ça marche.

                      Désolé pour l'attente de la réponse, merci beaucoup à vous.

                      Dans l'attente d'une réponse ^^

                      Bien cordialement.



                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 mai 2022 à 13:26:55

                        Les erreurs sont normalement du texte, pourquoi fournir des images ? Elles ne sont en plus pas passées…

                        Copie-colle le texte des erreurs et remplace dans le message ci-dessus, merci.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Ajout d'une police sur une image avec GD - PHP

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown