PHP/Wamp : problème avec la fonction imagettftext() et la police d'écriture

Le problème exposé dans ce sujet a été résolu.

Bonjour les zestes.

J’essaye d’afficher le mot « Nuage » sur une image à l’aide de la fonction imagettftext(), mais le code retourne l’erreur suivante :
s

Le fichier erreur.php se trouve dans le même répertoire que le fichier arial.ttf.
Ce dernier est un fichier existant.

Code source de erreur.php :

<?php

// La ligne ci-dessous permet d'afficher les erreurs
include 'notices.php';

$im = imagecreatetruecolor(300, 300);

// Couleur blanche
$blanc = imagecolorallocate($im, 255, 255, 255);

imagettftext($im, 5, 0, 50, 50, $blanc, 'arial.ttf', 'Nuage');

header('Content-Type: image/png');
imagepng($im);

Code source de notices.php (Je sais d’expérience que ce n’est pas de ce fichier d’où vient le souci) :

<?php

// Transforme les notices et avertissements en erreurs fatales
// qui bloquent le script. Sans ce code, ni l'image, ni les erreurs ne s'affichent.

function errHandle($errNo, $errStr, $errFile, $errLine)
{
    $msg = "$errStr in $errFile on line $errLine";
    if ($errNo == E_NOTICE || $errNo == E_WARNING)
    {
        throw new ErrorException($msg, $errNo);
    }
    exit($msg);
}

set_error_handler('errHandle');

Vraiment, merci par avance car ça me bloque dans un projet. ;)

Salut !

Si j’en crois la documentation de imgttftext(), c’est un souci souvent rencontré. Comme tu n’as pas d’espace dans ton chemin, je te proposerais au moins d’essayer les astuces donnée dans l’explication du paramètre fontfile.

+0 -0

Merci pour ton message.

Selon la version de la bibliothèque GD que PHP utilise, quand fontfile ne commence pas par une premier / alors .ttf sera ajouté au nom de fichier et la bibliothèque essaiera de rechercher ce nom de fichier le long d’un chemin de police défini par la bibliothèque.
[…]
Dans de nombreux cas où une police réside dans le même répertoire que le script en l’utilisant l’astuce suivante permettra d’atténuer les problèmes d’inclusion.

J’utilise la version 2.1.0 de GD selon la fonction phpinfo().
Si j’ai bien compris ce que m’indique ici la documentation, le code suivant devrait fonctionner :

<?php

// Définir la variable d'environnement pour GD
putenv('GDFONTPATH=' . realpath('.'));

// Nommez la police à utiliser (Notez l'absence de l'extension .ttf)
$font = 'arial';

// La ligne ci-dessous permet d'afficher les erreurs
include 'notices.php';

$im = imagecreatetruecolor(300, 300);

// Couleur blanche
$blanc = imagecolorallocate($im, 255, 255, 255);

imagettftext($im, 5, 0, 50, 50, $blanc, $font, 'Nuage');

header('Content-Type: image/png');
imagepng($im);

Malheureusement, cela ne fonctionne pas et une autre erreur est affichée :
erreur2.PNG

Puisque l’erreur indique un nom de fichier invalide, j’essaye avec d’autres noms de fichiers en essayant toutes les combinaisons possibles :

$font = 'arial';
$font = 'arial.ttf';
$font = '/arial';
$font = '/arial.ttf';

Aucun de ces noms ne fonctionne.

Je joue avec deux erreurs : la première m’indique « Invalid font filename », pour la corriger je renseigne donc le bon nom de fichier.
Puis vient alors la deuxième erreur qui m’indique « Could not find/open font », donc soit il ne trouve pas le fichier (ce qui me semble peu probable), soit il n’arrive pas à l’ouvrir. Je ne comprends pas pourquoi il n’arrive pas à ouvrir le fichier, c’est pourtant un fichier valide lorsque je tente de l’ouvrir avec windows.

En fait, je ne suis pas certain, mais j’ai l’impression qu’il s’agit de deux solutions, et non de deux lignes pour une solution. A tester…

Après, il se peut qu’il y ait des histoires de droits d’accès — j’en ai eu une pas plus tard qu’il y a deux heures avec PHP 7.0 qui ne pouvait plus accéder à Composer, alors que PHP 7.1 oui  o_O
Le temps de re-télécharger Composer et j’ai fini par penser à mon pare-feu qui avait effectivement mis mon PHP 7.0 CLI en exécution virtuelle, donc il n’avait pas accès au système de fichiers "normal", et dans le système virtuel, mon projet n’existe pas  :D

+0 -0

J’ai trouvé la solution, et c’était vraiment pas évident à trouver !

Il faut taper le chemin complet et absolu qui mène au fichier .ttf ET nommer ce dernier arial.ttf AVEC l’extention .ttf.

Le code qui fonctionne sous Windows 8.1 :

<?php

// Définir la variable d'environnement pour GD
putenv('GDFONTPATH=' . realpath('.'));

// Nommez la police à utiliser (Notez LA PRESENCE de l'extension .ttf)
$font = "C:\wamp64\www\james\phptools\biographie\arial.ttf";

// La ligne ci-dessous permet d'afficher les erreurs
include 'notices.php';

$im = imagecreatetruecolor(300, 300);

// Couleur blanche
$blanc = imagecolorallocate($im, 255, 255, 255);

imagettftext($im, 20, 0, 50, 50, $blanc, $font, 'Nuage');

header('Content-Type: image/png');
imagepng($im);

Pour une raison très obscure, tout autre nom de fichier que arial va renvoyer une erreur !

Si vous voulez plutôt utiliser la police de votre choix myfont.ttf, renommer d’abord le fichier en arial.ttf et la bonne police d’écriture sera utilisée.

J’espère que ce message pourra aider à l’avenir d’autres personnes qui ont rencontrées le même problème que moi parce que j’ai vraiment passé des heures à chercher une solution au problème, j’ai parcouru milles forums et c’est un peu par essais/erreurs que j’ai trouvé la solution. Sujet à archiver précieusement !

Et encore merci à Ymox pour sa présence sur le sujet ! ;)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte