8
votes

Utilisation de la fonction ImageTtFtext avec plusieurs lignes?

Je crée un texte transparent -> Images PNG avec PHP et jusqu'à présent si bon. Le seul problème est que je souhaite que la capacité de l'enveloppe de texte de texte en raison d'une largeur fixe. Ou aussi, être en mesure d'insérer des lignes de bris dans le texte. Quelqu'un a-t-il eu d'EXP faire cela? Voici mon code ...

<?php

$font = 'arial.ttf';
$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE';
$fontSize = 20;

$bounds = imagettfbbox($fontSize, 0, $font, $text); 

$width = abs($bounds[4]-$bounds[6]); 
$height = abs($bounds[7]-$bounds[1]); 



$im = imagecreatetruecolor($width, $height);
imagealphablending($im, false);
imagesavealpha($im, true);


$trans = imagecolorallocatealpha($im, 255, 255, 255, 127);

// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);


imagecolortransparent($im, $black);
imagefilledrectangle($im, 0, 0, $width, $height, $trans);


// Add the text
imagettftext($im, $fontSize, 0, 0, $fontSize-1, $grey, $font, $text);


imagepng($im, "image.png");
imagedestroy($im);


?>


0 commentaires

4 Réponses :


6
votes

exploser simplement le texte sur des espaces pour obtenir une gamme de mots, puis démarrez des lignes de construction en boucle via la matrice des mots, testez l'ajout de chaque nouveau mot via Imagettefbbox pour voir si elle crée une largeur supérieure à la maxWidth. Si c'est le cas, commencez le mot suivant sur une nouvelle ligne fraîche. Je trouve plus facile de créer simplement une nouvelle chaîne avec des caractères de rupture de ligne spéciaux ajoutés, puis explosez à nouveau cette chaîne pour créer une gamme de lignes, chacune desquelles vous écrirez sur l'image finale séparément.

Quelque chose comme ça: xxx

où le caractère du tuyau est le caractère de la ligne de la ligne.


2 commentaires

Ce code fonctionne superficiellement mais j'ai juste une question ... Comment vous séparez-vous alors chaque ligne?


Au lieu d'itération des lignes sur les lignes, ajoutez simplement php_eol lorsque la ligne devient trop longue, comme: si ($ linewidth <$ maxlinewidth) {$ nouveautext. = valeur. ''; } else {$ nouveautext. = php_eol. $ valeur; }



20
votes

Essayez ceci:

$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE';
$text = wordwrap($_POST['title'], 15, "\n");


1 commentaires

M'a aidé aujourd'hui. 2 ans après ... :-)



2
votes

de toutes les réponses postées, j'ai aimé génie en difficulté em> 's le meilleur mais il ajoute simplement une lamelle tous les 15 caractères plutôt que de laisser le texte "débit" comme dans un traitement de texte moderne avec des longueurs de ligne variables en fonction de la lecture de la police et de quels caractères (par exemple, le poids minuscule prend moins d'espace horizontal que la majuscule W-L vs. W).

J'ai proposé une solution que j'ai publiée comme source ouverte à HTTPS: / /Github.com/andrewgjohnson/Linebreaks4imagetFtext p>

Pour utiliser, vous changeriez simplement: P>

$font = 'arial.ttf';
$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE';
$fontSize = 20;
$bounds = imagettfbbox($fontSize, 0, $font, $text); 
$width = abs($bounds[4]-$bounds[6]);

// new code to add the "\n" line break characters to $text
require_once('linebreaks4imagettftext.php'); //https://raw.githubusercontent.com/andrewgjohnson/linebreaks4imagettftext/master/source/linebreaks4imagettftext.php
$text = \andrewgjohnson\linebreaks4imagettftext($fontSize, 0, $font, $text, $width);


1 commentaires

Cela fonctionne, mais d'aligner le texte au centre et de changer la hauteur de la ligne?



-2
votes

Si votre chaîne n'a aucun espace, vous pouvez essayer ceci:

 $text = 'Cool Stuff!thisisniceLALALALALALALAHEEHEHEHE';
 $text = wordwrap($_POST['title'], 15, "\n",true); //TRUE = Wrap


0 commentaires