Version complète: sur le forum Webmaster Hub : police personnalisée
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Loupilo
Salut,

Je cherche à créer une image avec gd.
Assez basique : fond transparent et texte en blanc (viva png).

Je créé donc mon image:

CODE
<?php
header ("Content-type: image/png");
$image = imagecreate(250,30);
$orange = imagecolorallocate($image, 255, 128, 0);
$texte = $_GET['t'];
$blanc = imagecolorallocate($image, 255, 255, 255);
$font = imageloadfont("swis.ttf");
imagestring($image, $font, 5, 1, $texte, $blanc);
imagepng($image);
?>


Et là... Ma police swis.ttf n'est pas utilisée, c'est la police php taille 1 (atroce).

Pourquoi ?

On m'a dit que gd n'acceptait que les polices en .gdf.
Mais j'ai déjà vu des générateurs d'images dynamiques qui fonctionnaient avec pas mal de polices ttf...
Et si ce n'est pas possible, je suppose que convertir des ttf en gdf ne l'est pas non plus ?

J'oubliais, quand je mets :
CODE
<?php
header ("Content-type: image/png");
$image = imagecreate(250,30);
$orange = imagecolorallocate($image, 255, 128, 0);
$texte = $_GET['t'];
$blanc = imagecolorallocate($image, 255, 255, 255);
$font = imageloadfont("swis.ttf");
if($font === FALSE) { echo 'erreur avec la police'; }
imagestring($image, $font, 5, 1, $texte, $blanc);
imagepng($image);
?>

Firefox me dit qu'il ne peut afficher l'image car elle contient des erreurs, mais l'affichage du code source me met bien "erreur avec la police" en tout début...

Le chemin est bon (le fichier swis.ttf est dans le même répertoire que mon fichier php), les permissions sont bonnes (777)...

Si vous avez une idée du pourquoi... wink.gif

Merci,
Loupilo.
Vincent
Est-ce que ta font ttf respecte bien ce format?
CITATION
Table 1. Font file format
byte position  C data type  description
byte 0-3  int  number of characters in the font
byte 4-7  int  value of first character in the font (often 32 for space)
byte 8-11  int  pixel width of each character
byte 12-15  int  pixel height of each character
byte 16-  char  array with character data, one byte per pixel in each character, for a total of (nchars*width*height) bytes.


voila les liens qui aident :

manuel PHP : imageloadfont
guide : comment creer une signature dynamique
User-defined Bitmap Fonts
Cariboo
J'ai déjà eu un problème de ce genre...

Le module Apache qui gère les polices true type est il correctement installé ?

Il s'appelle FreeType de mémoire...
Vincent
CITATION(Loupilo @ dimanche 23 janvier 2005, 14h52)
On m'a dit que gd n'acceptait que les polices en .gdf.
Mais j'ai déjà vu des générateurs d'images dynamiques qui fonctionnaient avec pas mal de polices ttf...

*


sinon, peut etre que tu te trompe de fonction...

est-ce que la fonction imagettftext ne serait pas plus appropriée?
Loupilo
CITATION(Vincent @ dimanche 23 janvier 2005, 16h34)
Est-ce que ta font ttf respecte bien ce format?
voila les liens qui aident :

manuel PHP : imageloadfont
guide : comment creer une signature dynamique
User-defined Bitmap Fonts
*


Je regarde ça...
[Edit: Je ne comprends rien à ce que c'est... Comment faire pour vérifier si ma police respecte le format ?]

CITATION(Cariboo @ dimanche 23 janvier 2005, 16h36)
J'ai déjà eu un problème de ce genre...

Le module Apache qui gère les polices true type est il correctement installé ?

Il s'appelle FreeType de mémoire...
*


Ma foi, je ne dispose que d'un phpinfo, travaillant sur un mutu ; je vais voir ce que je trouve sur FreeType...
[Edit: Aucune trace de FreeType dans le phpinfo...]

CITATION(Vincent @ dimanche 23 janvier 2005, 16h52)
sinon, peut etre que tu te trompe de fonction...

est-ce que la fonction imagettftext ne serait pas plus appropriée?
*


Avec:
CODE
<?php
header ("Content-type: image/png");
$image = imagecreate(250,30);
$orange = imagecolorallocate($image, 255, 128, 0);
$texte = $_GET['t'];
$blanc = imagecolorallocate($image, 255, 255, 255);
$font = 'swis.ttf';
imagettftext($image, 20, 0, 5, 5, $blanc, $font, $texte);
imagepng($image);
?>


J'ai:
CITATION(Firefox)
L'image ne peut être affichée, car elle contient des erreurs.
xpatval
J'allais poser la même question concernant les polices permises par ImageLoadFont, ayant moi-aussi des problèmes pour charger celle que je souhaite.

Malheureusement, les liens donnés par Vincent (en fait, ceux donnés par php.net) sont peu évocatifs...

Donc, la solution m'intéresse... Je suis ce post...I'm watching you.. whistling.gif

xpatval
Cariboo
Si ton phpinfo() ne renvoie aucune mention de Freetype, cela signifie que le module n'est pas probablement pas ou mal installé et que tu ne pourras pas exploiter toutes les fonctions maniant les ttf dans php (dont GD).

Il faut :
1. Que le module Freetype soit installé (compilation de la librairie C)
2. que php ait été compilé avec le support des ttf ( --with-freetype-dir=DIR pour freetype version 2, et --enable-gd-native-ttf' )
(à vérifier dans les directives de compilation au début de phpinfo

Enfin cela dépend de la version utilisée : je suppose que c'est une GD 2.xx ?

Ensuite, il faut installer correctement les polices ttf...
Loupilo
CITATION(Cariboo @ dimanche 23 janvier 2005, 19h02)
Si ton phpinfo() ne renvoie aucune mention de Freetype, cela signifie que le module n'est pas probablement pas ou mal installé et que tu ne pourras pas exploiter toutes les fonctions maniant les ttf dans php (dont GD).

Il faut :
1. Que le module Freetype soit installé (compilation de la librairie C)
2. que php ait été compilé avec le support des ttf ( --with-freetype-dir=DIR pour freetype version 2, et --enable-gd-native-ttf' )
(à vérifier dans les directives de compilation au début de phpinfo

Enfin cela dépend de la version utilisée : je suppose que c'est une GD 2.xx ?

Ensuite, il faut installer correctement les polices ttf...
*


Bon, ben c'est mort alors, je pense, vu que j'ai pas de trace de freetype...

Et effectivement, GD, c'est la version 2.0.15.

Mais pour installer correctement des ttf sur un mutu, je vois pas comment faire huh.gif ?
Loupilo
En attendant l'hypothétique activation de FreeType, j'ai fait mon code.

Mais je suis persuadé qu'il pourrait être 3 à 4 fois plus léger...

J'aimerais bien savoir comment, et surtout pourquoi tongue.gif

CODE
<?php
header ("Content-type: image/png");
$image = imagecreate(250,19);
$texte = $_GET['t'];
$couleur = $_GET['c'];
if ($couleur == r) { // Ça me permet d'avoir des tramages différents selon que le fond est bleu ou rouge
$cou = imagecolorresolve($image, 177, 0, 0);
}
elseif ($couleur == b) {
$cou = imagecolorresolve($image, 10, 14, 98);
}
else {
$cou = imagecolorresolve($image, 0, 0, 0);
}
imagecolortransparent($image, $cou);
$blanc = imagecolorallocate($image, 255, 255, 255);
$font = './swis.ttf';
imagettftext($image, 13, 0, 5, 15, $blanc, $font, $texte);
imagepng($image);
imagedestroy($image);
?>


Merci wink.gif
Loupilo.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.