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

Langage PHP Discussion :

Dessiner un texte avec une police TrueType


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Dessiner un texte avec une police TrueType
    Bonjour,
    J'aimerais améliorer le rendu du texte de mes images.
    Je pensais pouvoir m'en sortir avec "imagettftext" en déclarent une police "$font = 'arial.ttf';", mais je ne m'en sort pas.
    Pourriez-vous m'aider ?
    Le code (image.php).

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    <?php
    header("Content-type: image/png");
     
    $offsetGauche = 25;
    $offsetDroit = 15;
     
    $width = (isset($_GET['width']) ? $_GET['width'] : 240);
    $height = (isset($_GET['height']) ? $_GET['height'] : 35);
     
    $prog = (isset($_GET['prog']) ? $_GET['prog'] : '');
     
    $title = (isset($_GET['title']) ? $_GET['title'] : ' ');
     
    $n = intval(($width - $offsetGauche - $offsetDroit) / 24);
    $taille = $n * 24;
     
    $image = imagecreate($width, $height);
     
    $blanc = imagecolorallocate($image, 255, 255, 255);
     
    $orange = imagecolorallocate($image, 247, 163, 92);
    $rouge = imagecolorallocate($image, 255, 0, 0);
    $bleuclair = imagecolorallocate($image, 124, 182, 236);
     
    $gris = imagecolorallocate($image, 128, 128, 128);
    $grisClair = imagecolorallocate($image, 192, 192, 192);
    $noir = imagecolorallocate($image, 0, 0, 0);
     
    for ($i=0; $i<=24; $i++) {
        $x = $i*$n+$offsetGauche;
        if (($i % 6) == 0) {
            ImageLine($image, $x, 15, $x, 25, $gris);
            if ($i < 12) {
                $str = '0' . $i . ':00';
            } else {
                $str = $i . ':00';
            }
            imagestring($image, 2, $x-15, 0, $str, $noir);
        } else {
            ImageLine($image, $x, 20, $x, 25, $grisClair);
        }
    }
    imagestring($image, 2, 0, 20, $title, $noir);
     
    imagefilledrectangle($image, $offsetGauche, 26, $taille + $offsetGauche, 35, $bleuclair);
     
    if ($prog !== '') {
        $progs = explode(",", $prog);
        $n = count($progs);
        if (($n % 3) == 0) {
            for ($i=0; $i<$n; $i+=3) {
                $mode = $progs[$i];
                $start = $progs[$i+1];
                $end = $progs[$i+2];
                $nombres = explode(":", $start);
                $debut = $nombres[0] * 60 + $nombres[1];
                $debut = $offsetGauche + $taille * $debut / 1440;
                $nombres = explode(":", $end);
                $fin = $nombres[0] * 60 + $nombres[1];
                $fin = $offsetGauche + $taille * $fin / 1440;
                if ($mode === 'n') {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $orange);
                } else {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $rouge);
                }
            }
        }
    }
    imagepng($image);
    Dernière modification par ProgElecT ; 16/03/2022 à 20h58. Motif: Pour le code balises [code] ici votre code [/code], touche # de l'éditeur, NON FACULTATIF

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    J'ai essayé ce qui suit, mais sans arriver à mes fins.

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <?php
    header("Content-type: image/png");
     
    $offsetGauche = 25;
    $offsetDroit = 15;
     
    $width = (isset($_GET['width']) ? $_GET['width'] : 240);
    $height = (isset($_GET['height']) ? $_GET['height'] : 35);
     
    $prog = (isset($_GET['prog']) ? $_GET['prog'] : '');
     
    $title = (isset($_GET['title']) ? $_GET['title'] : ' ');
     
    $n = intval(($width - $offsetGauche - $offsetDroit) / 24);
    $taille = $n * 24;
     
    // $image = imagecreate($width, $height);
    $image = imagecreatetruecolor($width, $height);
     
    $blanc = imagecolorallocate($image, 255, 255, 255);
     
    $orange = imagecolorallocate($image, 247, 163, 92);
    $rouge = imagecolorallocate($image, 255, 0, 0);
    $bleuclair = imagecolorallocate($image, 124, 182, 236);
     
    $gris = imagecolorallocate($image, 128, 128, 128);
    $grisClair = imagecolorallocate($image, 192, 192, 192);
    $noir = imagecolorallocate($image, 0, 0, 0);
     
     
    // Définition de la variable d'environnement pour GD
    putenv('GDFONTPATH=' . realpath('.'));
     
    // Nom de la police à utiliser (notez l'absence de l'extension .ttf)
    $font = 'arial';	// mettre le fichier arial.ttf dans le même répertoire que le script.
     
     
    for ($i=0; $i<=24; $i++) {
        $x = $i*$n+$offsetGauche;
        if (($i % 6) == 0) {
            ImageLine($image, $x, 15, $x, 25, $gris);
            if ($i < 12) {
                $str = '0' . $i . ':00';
            } else {
                $str = $i . ':00';
            }
     
            // imagestring($image, 2, $x-15, 0, $str, $noir);
    		imagefttext($image, 14, 0, $x-15, 0, $noir, $font, $str);
     
        } else {
            ImageLine($image, $x, 20, $x, 25, $grisClair);
        }
    }
    // imagestring($image, 2, 0, 20, $title, $noir);
    imagefttext($image, 14, 0, 20, 0, $noir, $font, $title);
     
    imagefilledrectangle($image, $offsetGauche, 26, $taille + $offsetGauche, 35, $bleuclair);
     
    if ($prog !== '') {
        $progs = explode(",", $prog);
        $n = count($progs);
        if (($n % 3) == 0) {
            for ($i=0; $i<$n; $i+=3) {
                $mode = $progs[$i];
                $start = $progs[$i+1];
                $end = $progs[$i+2];
                $nombres = explode(":", $start);
                $debut = $nombres[0] * 60 + $nombres[1];
                $debut = $offsetGauche + $taille * $debut / 1440;
                $nombres = explode(":", $end);
                $fin = $nombres[0] * 60 + $nombres[1];
                $fin = $offsetGauche + $taille * $fin / 1440;
                if ($mode === 'n') {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $orange);
                } else {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $rouge);
                }
            }
        }
    }
    imagepng($image);

    Voyez-vous ou je fais erreur ?
    Bien cordialement

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Petit complément qui peut peut-être aider:
    Je tourne sous WampServer et la Librairie GD et décommandée sous php.ini (extension=gd2).
    Dernière modification par Invité ; 17/03/2022 à 20h18.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je pense que j'y suis presque, mais ne parviens pas à afficher mon texte.
    J'aurais vraiment besoin de votre expertise.

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php
    header("Content-type: image/png");
     
    $offsetGauche = 25;
    $offsetDroit = 15;
     
    $width = (isset($_GET['width']) ? $_GET['width'] : 240);
    $height = (isset($_GET['height']) ? $_GET['height'] : 35);
     
    $prog = (isset($_GET['prog']) ? $_GET['prog'] : '');
     
    $title = (isset($_GET['title']) ? $_GET['title'] : ' ');
     
    $n = intval(($width - $offsetGauche - $offsetDroit) / 24);
    $taille = $n * 24;
     
    // $image = imagecreate($width, $height);
    $image = imagecreatetruecolor($width, $height);
     
    //Pour fond transparent
    imagealphablending($image, false);
    imagesavealpha($image, true);
    $col=imagecolorallocatealpha($image,255,255,255,127);
    imagefill($image, 0, 0, $col);
     
    $blanc = imagecolorallocate($image, 255, 255, 255);
     
    $orange = imagecolorallocate($image, 247, 163, 92);
    $rouge = imagecolorallocate($image, 255, 0, 0);
    $bleuclair = imagecolorallocate($image, 124, 182, 236);
     
    $gris = imagecolorallocate($image, 128, 128, 128);
    $grisClair = imagecolorallocate($image, 192, 192, 192);
    $noir = imagecolorallocate($image, 0, 0, 0);
     
     
    // Définition de la variable d'environnement pour GD
    // putenv('GDFONTPATH=' . realpath('.'));
     
    // Nom de la police à utiliser (notez l'absence de l'extension .ttf)
    // $font = 'arial';	// mettre le fichier arial.ttf dans le même répertoire que le script.
    $font = getcwd().'/arial.ttf';
    //$font = "C:\wamp64\www\projet\Viessmann\images\arial.ttf";
     
     
    for ($i=0; $i<=24; $i++) {
        $x = $i*$n+$offsetGauche;
        if (($i % 6) == 0) {
            ImageLine($image, $x, 15, $x, 25, $gris);
            if ($i < 12) {
                $str = '0' . $i . ':00';
            } else {
                $str = $i . ':00';
            }
     
            // imagestring($image, 2, $x-15, 0, $str, $noir);
    		imagefttext($image, 12, 0, $x-15, 0, $noir, $font, $str);
     
        } else {
            ImageLine($image, $x, 20, $x, 25, $grisClair);
        }
    }
    // imagestring($image, 2, 0, 20, $title, $noir);
    imagefttext($image, 12, 0, 20, 0, $noir, $font, $title);
     
    imagefilledrectangle($image, $offsetGauche, 26, $taille + $offsetGauche, 35, $bleuclair);
     
    if ($prog !== '') {
        $progs = explode(",", $prog);
        $n = count($progs);
        if (($n % 3) == 0) {
            for ($i=0; $i<$n; $i+=3) {
                $mode = $progs[$i];
                $start = $progs[$i+1];
                $end = $progs[$i+2];
                $nombres = explode(":", $start);
                $debut = $nombres[0] * 60 + $nombres[1];
                $debut = $offsetGauche + $taille * $debut / 1440;
                $nombres = explode(":", $end);
                $fin = $nombres[0] * 60 + $nombres[1];
                $fin = $offsetGauche + $taille * $fin / 1440;
                if ($mode === 'n') {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $orange);
                } else {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $rouge);
                }
            }
        }
    }
    imagepng($image);

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    Prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    imagettftext(
        GdImage $image,
        float $size,
        float $angle,
        int $x,
        int $y,
        int $color,
        string $font_filename,
        string $text,
        array $options = []
    ): array|false
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imagefttext($image, 12, 0, 20, $y = 0, $noir, $font, $title);
    => Tu poses ton texte en dehors de l'image, augmente la valeur de $y

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Tu poses ton texte en dehors de l'image, augmente la valeur de $y
    Merci Séb.

    La valeur de $y n'étant pas défini avec "imagestring", je l'avais sans réfléchir passée à 0.
    Pas sûr que j'aurais fini par trouver !

    J'ai essayé plusieurs polices, le rendu n'est pas aussi précis que ce que j'aurais imaginé.
    Lors de ma recherche sur le sujet, je suis tombé sur une méthode qui semble être de l'anti-Aliasing / anticrénelage, c'est ici :

    https://stackoverflow.com/questions/...xt-transparent

    Pensez-vous que cela puisse améliorer l'affichage de la police dans mon cas ?

    Bien cordialement

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    La procédure du lien ci-dessus, ne semble pas apporter d'amélioration sur la qualité d'affichage de la police d'écriture sur l'image.

    Le code fonctionnel avec prise en charge de la police avec "imagefttext" :

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <?php
    header("Content-type: image/png");
     
    $offsetGauche = 25;
    $offsetDroit = 15;
     
    $width = (isset($_GET['width']) ? $_GET['width'] : 240);
    $height = (isset($_GET['height']) ? $_GET['height'] : 35);
     
    $prog = (isset($_GET['prog']) ? $_GET['prog'] : '');
     
    $title = (isset($_GET['title']) ? $_GET['title'] : ' ');
     
    $n = intval(($width - $offsetGauche - $offsetDroit) / 24);
    $taille = $n * 24;
     
    // $image = imagecreate($width, $height);
    $image = imagecreatetruecolor($width, $height);
     
    //Pour fond transparent
    imagealphablending($image, false);
    imagesavealpha($image, true);
    $col=imagecolorallocatealpha($image,255,255,255,127);
    imagefill($image, 0, 0, $col);
     
    $blanc = imagecolorallocate($image, 255, 255, 255);
     
    $orange = imagecolorallocate($image, 247, 163, 92);
    $rouge = imagecolorallocate($image, 255, 0, 0);
    $bleuclair = imagecolorallocate($image, 124, 182, 236);
     
    $gris = imagecolorallocate($image, 128, 128, 128);
    $grisClair = imagecolorallocate($image, 192, 192, 192);
    $noir = imagecolorallocate($image, 0, 0, 0);
     
    $font = getcwd().'/ARIALN.TTF';	// mettre le fichier de la police à utiliser dans le même répertoire que le script.
    //$font = "C:\wamp64\www\projet\Viessmann\images\ARIALN.TTF";
     
    for ($i=0; $i<=24; $i++) {
        $x = $i*$n+$offsetGauche;
        if (($i % 6) == 0) {
            ImageLine($image, $x, 15, $x, 25, $gris);
            if ($i < 12) {
                $str = '0' . $i . ':00';
            } else {
                $str = $i . ':00';
            }
     
            // imagestring($image, 2, $x-15, 0, $str, $noir);
    		imagefttext($image, 10, 0, $x-13, 10, $noir, $font, $str);
     
        } else {
            ImageLine($image, $x, 20, $x, 25, $grisClair);
        }
    }
     
    // imagestring($image, 2, 0, 20, $title, $noir);
    imagefttext($image, 10, 0, 0, 30, $noir, $font, $title);
     
    imagefilledrectangle($image, $offsetGauche, 26, $taille + $offsetGauche, 35, $bleuclair);
     
    if ($prog !== '') {
        $progs = explode(",", $prog);
        $n = count($progs);
        if (($n % 3) == 0) {
            for ($i=0; $i<$n; $i+=3) {
                $mode = $progs[$i];
                $start = $progs[$i+1];
                $end = $progs[$i+2];
                $nombres = explode(":", $start);
                $debut = $nombres[0] * 60 + $nombres[1];
                $debut = $offsetGauche + $taille * $debut / 1440;
                $nombres = explode(":", $end);
                $fin = $nombres[0] * 60 + $nombres[1];
                $fin = $offsetGauche + $taille * $fin / 1440;
                if ($mode === 'n') {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $orange);
                } else {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $rouge);
                }
            }
        }
    }
    imagepng($image);

    Le même code avec les modifications du lien du message précédent :

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    <?php
    header("Content-type: image/png");
     
    $offsetGauche = 25;
    $offsetDroit = 15;
     
    $width_simple = (isset($_GET['width']) ? $_GET['width'] : 240);
    $width_double = (isset($_GET['width']) ? $_GET['width'] : 480);
    $height_simple = (isset($_GET['height']) ? $_GET['height'] : 35);
    $height_double = (isset($_GET['height']) ? $_GET['height'] : 70);
    $fontSize = 10; //Ajout
    $fontSize_double = $fontSize * 2; //Ajout
     
    $prog = (isset($_GET['prog']) ? $_GET['prog'] : '');
     
    $title = (isset($_GET['title']) ? $_GET['title'] : ' ');
     
    $n = intval(($width_simple - $offsetGauche - $offsetDroit) / 24);
    $taille = $n * 24;
     
    // $image = imagecreate($width, $height);
    // $image = imagecreatetruecolor($width, $height);
    $image = imagecreatetruecolor($width_double, $height_double);
     
    //Pour fond transparent
    imagealphablending($image, false);
    imagesavealpha($image, true);
    $col=imagecolorallocatealpha($image,255,255,255,127);
    imagefill($image, 0, 0, $col);
     
    $blanc = imagecolorallocate($image, 255, 255, 255);
     
    $orange = imagecolorallocate($image, 247, 163, 92);
    $rouge = imagecolorallocate($image, 255, 0, 0);
    $bleuclair = imagecolorallocate($image, 124, 182, 236);
     
    $gris = imagecolorallocate($image, 128, 128, 128);
    $grisClair = imagecolorallocate($image, 192, 192, 192);
    $noir = imagecolorallocate($image, 0, 0, 0);
     
    $font = getcwd().'/ARIALN.TTF';	// mettre le fichier de la police à utiliser dans le même répertoire que le script.
    //$font = "C:\wamp64\www\projet\Viessmann\images\ARIALN.TTF";
     
    for ($i=0; $i<=24; $i++) {
        $x = $i*$n+$offsetGauche;
        if (($i % 6) == 0) {
            ImageLine($image, $x, 15, $x, 25, $gris);
            if ($i < 12) {
                $str = '0' . $i . ':00';
            } else {
                $str = $i . ':00';
            }
     
            // imagestring($image, 2, $x-15, 0, $str, $noir);
    		imagefttext($image, $fontSize, 0, $x-13, 10, $noir, $font, $str);
     
        } else {
            ImageLine($image, $x, 20, $x, 25, $grisClair);
        }
    }
     
    // imagestring($image, 2, 0, 20, $title, $noir);
    imagefttext($image, $fontSize, 0, 0, 30, $noir, $font, $title);
     
    imagefilledrectangle($image, $offsetGauche, 26, $taille + $offsetGauche, 35, $bleuclair);
     
    if ($prog !== '') {
        $progs = explode(",", $prog);
        $n = count($progs);
        if (($n % 3) == 0) {
            for ($i=0; $i<$n; $i+=3) {
                $mode = $progs[$i];
                $start = $progs[$i+1];
                $end = $progs[$i+2];
                $nombres = explode(":", $start);
                $debut = $nombres[0] * 60 + $nombres[1];
                $debut = $offsetGauche + $taille * $debut / 1440;
                $nombres = explode(":", $end);
                $fin = $nombres[0] * 60 + $nombres[1];
                $fin = $offsetGauche + $taille * $fin / 1440;
                if ($mode === 'n') {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $orange);
                } else {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $rouge);
                }
            }
        }
    }
     
    $dest = imagecreatetruecolor($width_simple, $height_simple);
    imagealphablending($dest, false);
    imagesavealpha($dest, true);
    imagecopyresampled($dest, $image, 0, 0, 0, 0, $width_simple, $height_simple, $width_double, $height_double);
    //imagepng($image);
    imagepng($dest);

    Une idée / solution viendra peut-être aux experts de ce forum ?

    Bien cordialement
    Dernière modification par Invité ; 18/03/2022 à 22h28.

  8. #8
    Membre habitué Avatar de ane-mais
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 37
    Points : 162
    Points
    162
    Par défaut
    Bonjour,

    J'ai eu un soucis similaire.
    Il faut tenir compte de la taille de la police, de la résolution de l'image d'origine et celle de l'image pour la police pour écrire le texte, sans oublier la compression de l'image.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour ane-mais, bonjour à tous,

    Pourrais-je espérer un petit coup de main, ou un petit exemple ?

    J'avoue ne pas bien comprendre l'action à mener sur ces paramètres.

    Citation Envoyé par ane-mais Voir le message
    Il faut tenir compte de la taille de la police, de la résolution de l'image d'origine et celle de l'image pour la police pour écrire le texte, sans oublier la compression de l'image.
    Je remets le code avec mes derniers petits ajustements

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
    header("Content-type: image/png");
     
    $offsetGauche = 25;
    $offsetDroit = 15;
     
    $width = (isset($_GET['width']) ? $_GET['width'] : 240);
    $height = (isset($_GET['height']) ? $_GET['height'] : 35);
     
    $fontSize = 10;
     
    $prog = (isset($_GET['prog']) ? $_GET['prog'] : '');
     
    $title = (isset($_GET['title']) ? $_GET['title'] : ' ');
     
    $n = intval(($width - $offsetGauche - $offsetDroit) / 24);
    $taille = $n * 24;
     
    // $image = imagecreate($width, $height);
    $image = imagecreatetruecolor($width, $height);
     
    //Pour fond transparent
    imagealphablending($image, false);
    imagesavealpha($image, true);
    $col=imagecolorallocatealpha($image,255,255,255,127);
    imagefill($image, 0, 0, $col);
     
    $blanc = imagecolorallocate($image, 255, 255, 255);
     
    $orange = imagecolorallocate($image, 247, 163, 92);
    $rouge = imagecolorallocate($image, 255, 0, 0);
    $bleuclair = imagecolorallocate($image, 124, 182, 236);
     
    $gris = imagecolorallocate($image, 128, 128, 128);
    $grisClair = imagecolorallocate($image, 192, 192, 192);
    $noir = imagecolorallocate($image, 0, 0, 0);
     
    $fontfile = getcwd().'/ARIALN.TTF';	// mettre le fichier de la police à utiliser dans le même répertoire que le script.
    									// $fontfile = "C:\wamp64\www\projet\Viessmann\images\ARIALN.TTF";
     
    $strAngle = 0;
    $strX = 13;
    $strY = 10;
     
    $titleAngle = 0;
    $titleX = 0;
    $titleY = 30;
     
    for ($i=0; $i<=24; $i++) {
        $x = $i*$n+$offsetGauche;
        if (($i % 6) == 0) {
            ImageLine($image, $x, 15, $x, 25, $gris);
            if ($i < 12) {
                $str = '0' . $i . ':00';
            } else {
                $str = $i . ':00';
            }
     
            // imagestring($image, 2, $x-15, 0, $str, $noir);
    		imagefttext($image, $fontSize, $strAngle, $x-$strX , $strY, $noir, $fontfile, $str);
     
        } else {
            ImageLine($image, $x, 20, $x, 25, $grisClair);
        }
    }
     
    // imagestring($image, 2, 0, 20, $title, $noir);
    imagefttext($image, $fontSize, $titleAngle, $titleX, $titleY, $noir, $fontfile, $title);
     
    imagefilledrectangle($image, $offsetGauche, 26, $taille + $offsetGauche, 35, $bleuclair);
     
    if ($prog !== '') {
        $progs = explode(",", $prog);
        $n = count($progs);
        if (($n % 3) == 0) {
            for ($i=0; $i<$n; $i+=3) {
                $mode = $progs[$i];
                $start = $progs[$i+1];
                $end = $progs[$i+2];
                $nombres = explode(":", $start);
                $debut = $nombres[0] * 60 + $nombres[1];
                $debut = $offsetGauche + $taille * $debut / 1440;
                $nombres = explode(":", $end);
                $fin = $nombres[0] * 60 + $nombres[1];
                $fin = $offsetGauche + $taille * $fin / 1440;
                if ($mode === 'n') {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $orange);
                } else {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $rouge);
                }
            }
        }
    }
    imagepng($image);
    imagedestroy($image);
    ?>
    Dernière modification par Invité ; 19/03/2022 à 23h44.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Deux exemples qui semblent bien reprendre la proposition de @ane-mais.
    1: https://stackoverflow.com/questions/...-to-anti-alias
    2: http://www.hackingwithphp.com/11/2/6/outputting-text

    Mais, je ne parviens pas à créer mon tableau "imagettfbbox".

    Je pose le code avec mes tentatives, mais il est peut-être plus simple de repartir du code fonctionnel du message précèdent car j'ai semé une belle pagaille !

    J'ai besoin d'aide, j'ai vraiment perdu le fil sur ce coup-là.

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    <?php
    header("Content-type: image/png");
     
    $offsetGauche = 30;
    $offsetDroit = 15;
     
    $xsize = abs($size[0]) + abs($size[2]);
    $ysize = abs($size[5]) + abs($size[1]);
    $size = imagettfbbox($_GET['size'], 0, $fontfile, $_GET['title']);
     
    // $width = (isset($_GET['width']) ? $_GET['width'] : 240);
    $width = (isset($_GET['width']) ? $_GET['width'] : $xsize);
    // $height = (isset($_GET['height']) ? $_GET['height'] : 35);
    $height = (isset($_GET['height']) ? $_GET['height'] : $ysize);
     
    $prog = (isset($_GET['prog']) ? $_GET['prog'] : '');
     
    $title = (isset($_GET['title']) ? $_GET['title'] : ' ');
     
    $n = intval(($width - $offsetGauche - $offsetDroit) / 24);
    $taille = $n * 24;
     
    // $fontSize = 10;
    if(!isset($_GET['size'])) $_GET['size'] = 10;
     
    $fontfile = getcwd().'/segoeui.ttf';	// mettre le fichier de la police à utiliser dans le même répertoire que le script.
    									// $fontfile = "C:\wamp64\www\projet\Viessmann\images\ARIALN.TTF";
     
    // $image = imagecreate($width, $height);
    $image = imagecreatetruecolor($width, $height);
     
    //Pour fond transparent
    imagealphablending($image, false);
    imagesavealpha($image, true);
    $col=imagecolorallocatealpha($image,255,255,255,127);
    imagefill($image, 0, 0, $col);
     
    $blanc = imagecolorallocate($image, 255, 255, 255);
     
    $orange = imagecolorallocate($image, 247, 163, 92);
    $rouge = imagecolorallocate($image, 255, 0, 0);
    $bleuclair = imagecolorallocate($image, 124, 182, 236);
     
    $gris = imagecolorallocate($image, 128, 128, 128);
    $grisClair = imagecolorallocate($image, 192, 192, 192);
    $noir = imagecolorallocate($image, 0, 0, 0);
     
    $strAngle = 0;
    $strX = 15;
    $strY = 10;
     
    $titleAngle = 0;
    $titleX = 0;
    $titleY = 30;
     
    for ($i=0; $i<=24; $i++) {
        $x = $i*$n+$offsetGauche;
        if (($i % 6) == 0) {
            ImageLine($image, $x, 15, $x, 25, $gris);
            if ($i < 12) {
                $str = '0' . $i . ':00';
            } else {
                $str = $i . ':00';
            }
     
            // imagestring($image, 2, $x-15, 0, $str, $noir);
    		//imagefttext($image, $fontSize, $strAngle, $x-$strX, $strY, $noir, $fontfile, $str);
    		imagefttext($image, $_GET['size'], $strAngle, abs($size[0]), abs($size[5]), $noir, $fontfile, $str);
     
        } else {
            ImageLine($image, $x, 20, $x, 25, $grisClair);
        }
    }
     
    // imagestring($image, 2, 0, 20, $title, $noir);
    //imagefttext($image, $fontSize, $titleAngle, $titleX, $titleY, $noir, $fontfile, $title);
    imagefttext($image, $_GET['size'], $titleAngle, abs($size[0]), abs($size[5]), $noir, $fontfile, $title);
     
    imagefilledrectangle($image, $offsetGauche, 26, $taille + $offsetGauche, 35, $bleuclair);
     
    if ($prog !== '') {
        $progs = explode(",", $prog);
        $n = count($progs);
        if (($n % 3) == 0) {
            for ($i=0; $i<$n; $i+=3) {
                $mode = $progs[$i];
                $start = $progs[$i+1];
                $end = $progs[$i+2];
                $nombres = explode(":", $start);
                $debut = $nombres[0] * 60 + $nombres[1];
                $debut = $offsetGauche + $taille * $debut / 1440;
                $nombres = explode(":", $end);
                $fin = $nombres[0] * 60 + $nombres[1];
                $fin = $offsetGauche + $taille * $fin / 1440;
                if ($mode === 'n') {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $orange);
                } else {
                    imagefilledrectangle($image, $debut, 26, $fin, 35, $rouge);
                }
            }
        }
    }
    imagepng($image, null, 9);
    imagedestroy($image);
    ?>

  11. #11
    Membre habitué Avatar de ane-mais
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 37
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    Auriez-vous une image à améliorer et une de celle que vous obtenez ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je n'utilise pas d'image, elle est créée via le code avec "imagecreatetruecolor" puis sont contenue via "ImageLine", "imagefilledrectangle" puis vient le texte "imagefttext".

    C'est vraiment au niveau de la qualité d'affichage du texte que j'ai un problème, c'est "grossier" comme si j'avais choisi la police en gras et c'est limite flou.
    Dernière modification par Invité ; 21/03/2022 à 12h07.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour mieux vous présenter mon problème,

    En utilisant la police d'écriture "segoeui.ttf" avec une taille de 10px.

    Sur l'image ci-dessous :
    A gauche ce que j'obtiens avec le code PHP.
    A droite ce que je devrais obtenir avec la même police d'écriture.

    Nom : progE.JPG
Affichages : 124
Taille : 201,3 Ko
    Dernière modification par Invité ; 22/03/2022 à 21h08.

  14. #14
    Membre habitué Avatar de ane-mais
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 37
    Points : 162
    Points
    162
    Par défaut
    Bonjour,

    Comment est obtenue l'image de droite, la plus fine ?

    Si c'est par un logiciel de dessin, souvent la police est lissée ou recalculée pour être adaptée au mieux.
    Ce que ne doit pas faire php de base.

    Pour mieux comparer les 2 images, merci de bien vouloir les dissocier et les poster.

    Après en ccs ce n'est que quelques lignes de mise en forme ... Je dis ça, je ne dit rien !

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pour l'image de droite c'est bien avec un logiciel de dessin, mais la police est créée via php par un simple echo, puis capture d'écran.
    Ce qui pourrais peut-être être une alternative au lieu de dessiner le texte, le "superposer" à l'image?
    Peut-on écrire sur une image créée en php?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    La question initiale de ce poste "Dessiner un texte avec une police TrueType" ayant trouvé réponde, j'ai créé une nouvelle discussion relative à mon problème de qualité du texte.
    Voir: [GD] Qualité du texte écrire sur une image avec une police TTF – imagefttext

    Bien cordialement

  17. #17
    Membre habitué Avatar de ane-mais
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 37
    Points : 162
    Points
    162
    Par défaut
    La question initiale étant

    Citation Envoyé par NeriXs Voir le message
    J'aimerais améliorer le rendu du texte de mes images.
    je ne vois pas en quoi elle est résolue vu le contenu du nouveau post https://www.developpez.net/forums/d2.../#post11827633 (inutile à mon avis).

    J'ai autre chose à faire que de courrir après les post pour le même sujet.

    Bonne continuation.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour ane-mais,

    Je pensais bien faire en séparent!
    Le code du début utilisait " imagestring" et donc une police non personnalisable!
    J'ai eu quelque difficulté avec "imagettftext" que je plaçais hors image et que @Séb. a mis en évidence.

    J'avais l'impression que ma demande s'écartait de la demande d'origine.
    Désolé je ne voulais pas vous faire perdre votre temps!

    Bonne continuation également.

  19. #19
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Je pense que c'est lié a la résolution du l'écran ça fonctionne correctement chez moi

    vous pouvez lire cet article comment calculer le paramètre fontsize ..

    https://blog.karthisoftek.com/a?ID=0...c-1df88da93dec


    Nom : S.png
Affichages : 83
Taille : 16,5 Ko

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Sur la page du lien que vous avez donné, on peut lire :

    (2) $size , le document officiel explique que la taille de la police et son unité de longueur dépendent de la version de la bibliothèque GD, qui est en pixels pour GD1 et en points pour GD2.

    Cher moi c'est bien GD2 .
    Vous ne seriez pas en GD1 ?


    Citation Envoyé par wheel Voir le message
    vous pouvez lire cet article comment calculer le paramètre fontsize ..

    https://blog.karthisoftek.com/a?ID=0...c-1df88da93dec
    Mon écran, Dell Ultra HD 4k P2715Q, 27", Résolution : 3 840×2 160, 163 DPI.

    Je n'ai pas compris comment calculer le paramètre font size ..

Discussions similaires

  1. [XL-2016] Constituer une ligne de texte avec plusieurs polices de caractères
    Par PaulG2B dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/05/2020, 21h13
  2. Réponses: 4
    Dernier message: 02/02/2017, 19h50
  3. Afficher du texte avec une police personnalisée.
    Par Rakken dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 21/12/2008, 20h06
  4. Réponses: 4
    Dernier message: 25/04/2005, 19h36
  5. [MFC] label avec une police qui s'ajuste
    Par romeo9423 dans le forum MFC
    Réponses: 7
    Dernier message: 15/03/2005, 14h27

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