Bonjour,

Depuis plusieurs jours, je me prends la tête sur un problème que je rencontre sur le site que je dois développer à l'aide de CMSMS. Le problème ne vient pas directement de celui-ci mais des fonctions qu'il utilise. J'utilise le module TruetypeText qui permet de convertir du texte en image avec la police souhaitée. Pour cela, il utilise donc les fonctions PHP imagettfbbox et imagettftext.

Le problème est que la police utilisée est inclinée (comme en italique) et il semblerait que ça passe très mal avec ces fonctions.

Ça c'est en ligne (Linux) lorsque tous les mots ne forme qu'une seule et même image :



La même chose mais en local (Windows/WAMP) :



A première vue le problème vient de la différence de serveur, pourtant il y a quand même un problème qui est similaire, c'est lorsqu'on assigne une image par mot (et non une image pour tous les mots).





Vous remarquez que le "p" est coupé, et c'est la même chose pour toutes les lettres avec des queues "y, p, j, g, f, q". Le mot "test" lui est bien, la largeur est bonne et bien calculée. Pour le mot "police", la largeur est bonne sauf que la position x de départ est mauvaise.

Il serait simple de tester chaque première lettre et de décaler le x mais ce n'est pas une solution viable parce que ça ferait buguer les autres polices qui ne sont pas inclinée.

Je vous met juste le code avec lequel je fais mes tests basiques :

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
 
$text = "test";
//$font = "./arial.ttf";
$font = "./e111psto.ttf";
//$font = "./Gabrielle.ttf";
//$font = "./BALLW.ttf";
$size = "60";
 
$bbox = imagettfbbox($size, 0, $font, $text);
 
$width = abs($bbox[2] - $bbox[0]);
$height = abs($bbox[7] - $bbox[1]);
 
$image = imagecreatetruecolor($width, $height);
 
$bgcolor = imagecolorallocate($image, 255, 255, 255);
$color = imagecolorallocate($image, 0, 0, 0);
 
$x = $bbox[0] + ($width / 2) - ($bbox[4] / 2);
$y = $bbox[1] + ($height / 2) - ($bbox[5] / 2);
 
imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
imagettftext($image, $size, 0, $x, $y, $color, $font, $text);
 
$last_pixel= imagecolorat($image, 0, 0);
 
for ($j = 0; $j < $height; $j++)
{
    for ($i = 0; $i < $width; $i++)
    {
        if (isset($blank_left) && $i >= $blank_left)
        {
            break;
        }
 
        if (imagecolorat($image, $i, $j) !== $last_pixel)
        {
            if (!isset($blank_top))
            {
                $blank_top = $j;
            }
            $blank_left = $i;
            break;
        }
 
        $last_pixel = imagecolorat($image, $i, $j);
    }
}
 
$x -= $blank_left;
$y -= $blank_top;
 
imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
imagettftext($image, $size, 0, $x, $y, $color, $font, $text);
 
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
 
?>
J'ai parcouru le manuel PHP ainsi que les commentaires présents pour chacune des fonctions mais je ne trouve personne qui a ce problème, même pas sur google et pourtant, il en sait des choses.

Je travaille avec PHP 5.2.13 (sachant que selon la version, ça ne donne pas toujours les même résultats).

Si quelqu'un a rencontré ce problème ou pouvait m'aider là dessus... Merci.