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

Bibliothèques et frameworks PHP Discussion :

Eviter la coupure de texte trop longue sur une image générée par PHP


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Points : 24
    Points
    24
    Par défaut Eviter la coupure de texte trop longue sur une image générée par PHP
    Bonjour,

    Pour générer des images automatiquement, j'ai ce bout de code qui me permet d'ajouter deux textes sur une image existante.
    Ces deux textes sont séparés par un séparateur vertical.
    Le texte à gauche doit etre aligné sur la droite, le texte de droite est aligné sur la gauche.
    Nom : nolive.png
Affichages : 99
Taille : 43,6 Ko
    Quand le texte est trop long (texte issu d'une base de données), celui-ci est bien sur tronqué.

    Existe t-il un moyen de faire un retour à la ligne pour un texte trop long ? Je mets ici des / car ce caractère existe dans le texte issu de la requête SQL. Je pensais faire un retour à la ligne sur ce caractère mais bien sur, impossible... le texte restera sur 1 ligne.


    Voici le code.
    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
    $text = 'Un texte un / peu trop long';
    $text2 = 'Un texte un / peu trop long';
    $fontfile = "sys/Mohave-MediumItalic.otf";
     
    $im = imagecreatefromjpeg('nolive.jpg');
    $white = imagecolorallocate($im, 255, 255, 255);
    $i_width  = 400;
    $i_height = 400;
    $img = 'NOLIVE_U18400.jpg';  // image source
    $img3 = 'NOLIVE_U18400-3.jpg';  // image qui sera enregistrée
    $font_size = 14;  // Taille de la police.
    $string_size = ImageFtBbox($font_size, 0, $fontfile, $text, array("linespacing" => 1)); // On aligne à droite le texte de gauche (contre le séparateur vert)
    $s_width  = $string_size[4];
    $s_height = $string_size[5];
     
    ImageFtText($im, $font_size, 0, $i_width - $s_width - 220,  135, $white, $fontfile, $text, array("linespacing" => 1));
    imagettftext($im, $font_size, 0, 220, 135, $white, $fontfile, $text2);
    ImagePNG ($im, $img3, 9);
    echo 'image = <img src="NOLIVE_U18400-3.jpg">';
    ImageDestroy ($im);

  2. #2
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 397
    Points : 795
    Points
    795
    Par défaut
    Bonjour,

    Tu peux utiliser \n dans la chaine de caractère pour insérer un saut de ligne.
    La chaine doit être délimitée par des guillemets doubles pour prendre en compte les caractères spéciaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $text = "Un texte un\npeu trop long"; // affiche un saut de ligne, guillemets doubles
    $text2 = 'Un texte un\npeu trop long'; // affiche \n, guillemets simples
    https://www.php.net/manual/fr/language.types.string.php

  3. #3
    Membre à l'essai
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Merci, en fait, comme je disais, le texte provient d'une requête SQL sur la base de données.
    J'ai essayé avec un str_ireplace sur la variable extraite mais cela me donne le texte avec \n
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $array1 = array("/"," ");//Complète ici tout les mots qui dooivent être remplacé
    	$array2 = array("\n","\n");//Complète ici tous les mots qui remplace ceux de array1 (ATTENTION à l'ordre)
    $changer = str_ireplace($array1, $array2, $text);
    $changer2 = str_ireplace($array1, $array2, $text2);
    avec des simples ou doubles guillemets

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 944
    Points : 6 804
    Points
    6 804
    Par défaut
    À en juger par ce commentaire issu de la doc PHP, les sauts de ligne et les tabulations ne sont pas toujours bien traités. Ça doit être lié à la version de gd. Avec PHP 8.4 et gd 2.3.3, les sauts de ligne sont correctement rendus mais pas les tabulations.

    Un petit exemple avec un texte sur une ligne qui est ensuite découpé suivant une largeur moyenne estimée. Les morceaux obtenus sont ensuite alignés le long de l'axe central:
    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
    $text1 = 'Viuere, Gallio frater, omnes beate uolunt, sed ad peruidendum quid sit quod beatam uitam efficiat caligant; adeoque non est facile consequi beatam uitam ut eo quisque ab ea longius recedat quo ad illam concitatius fertur, si uia lapsus est; quae ubi in contrarium ducit, ipsa uelocitas maioris interualli causa fit. Proponendum est itaque primum quid sit quod adpetamus; tunc circumspiciendum qua contendere illo celerrime possimus, intellecturi in ipso itinere, si modo rectum erit, quantum cotidie profligetur quantoque propius ab eo simus ad quod nos cupiditas naturalis inpellit.';
     
    $text2 = 'Quam diu quidem passim uagamur non ducem secuti sed fremitum et clamorem dissonum in diuersa uocantium, conteretur uita inter errores, breuis etiam si dies noctesque bonae menti laboremus. Decernatur itaque et quo tendamus et qua, non sine perito aliquo cui explorata sint ea in quae procedimus, quoniam quidem non eadem hic quae in ceteris peregrinationibus condicio est: in illis comprensus aliquis limes et interrogati incolae non patiuntur errare, at hic tritissima quaeque uia et celeberrima maxime decipit.';
     
    $fontPath = '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf';
    $outputFileName = 'imgtile.png';
     
    $im = imagecreatetruecolor(600, 800);
     
    $linePosition = 300;
    $lineColor = imagecolorallocate($im, 0xFF, 0xAA, 0xAA); 
    imageline($im, $linePosition, 0, $linePosition, 799, $lineColor);
     
    $textColor = imagecolorallocate($im, 0xAA, 0xFF, 0xFF);
     
     
    $fontSize = 10;
    $coef = .75;
    $charWidth = ceil($fontSize * $coef);
    $lineHeight = 20;
     
    $margin = 25;
    $marginTop = 100;
     
    $maxChar = ceil((300 - 2 * $margin) / $charWidth);
     
     
    $pattern = "~
        \s*+ \K
        \X{1,$maxChar} (?<! \s )
        (?! \S )
    ~xu";
     
     
    preg_match_all($pattern, $text1, $m);
     
    foreach($m[0] as $n => $line) {
        $box = imagettfbbox($fontSize, 0, $fontPath, $line);
        $width = $box[2] - $box[0];
        $x = $linePosition - $margin - $width;
        $y = $marginTop + $n * $lineHeight;
        imagettftext($im, $fontSize, 0, $x, $y, $textColor, $fontPath, $line);
    }
     
    preg_match_all($pattern, $text2, $m);
     
    foreach($m[0] as $n => $line) {
        $x = $linePosition + $margin;
        $y = $marginTop + $n * $lineHeight;
        imagettftext($im, $fontSize, 0, $x, $y, $textColor, $fontPath, $line);
    }
     
    imagepng($im, $outputFileName, 9);
    J'ai fait le choix d'utiliser une police qui ne soit pas monospace (où tous les caractères occupent la même largeur). Du coup, il faut concéder une part d'approximation et par conséquent se ménager une marge pour éviter de sortir de l'image.
    Tu peux remarquer que j'ai introduit une variable $coef, celle-ci est déterminée par essais successifs et dépend de la font employée.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Merci

    En fait, je ne sais pas pourquoi, mais un deuxième essai avec le même script ne me renvoyait plus les \n sur l'image... Mais j'avais un autre souci.

    Et ton bout de code, c'est exactement ce que je cherchais, avec quelques adaptations (mettre la ligne de séparation en transparence par exemple), je suis arrivé à faire ce que je voulais. Merci encore.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/11/2014, 09h49
  2. Requête trop longue sur Oracle
    Par matching_ds dans le forum Oracle
    Réponses: 7
    Dernier message: 20/04/2012, 16h33
  3. Eviter que le contour indiquant un lien sur une image
    Par bilou95 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 09/08/2007, 16h27
  4. Faire la différence entre texte et photos sur une image
    Par NiuAge dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 24/02/2007, 00h45
  5. [GD] Enregistrer une image générée par PHP sur disque dur
    Par Alex01 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 03/05/2006, 12h16

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