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); ?>
4 Réponses :
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: p> où le caractère du tuyau est le caractère de la ligne de la ligne. p> p>
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; } code>
Essayez ceci:
$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE'; $text = wordwrap($_POST['title'], 15, "\n");
M'a aidé aujourd'hui. 2 ans après ... :-)
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);
Cela fonctionne, mais d'aligner le texte au centre et de changer la hauteur de la ligne?
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