Texte aligné à droite dans une image avec imagettftext (), PHP
je mets en place des images de signature de forum dynamique pour mes utilisateurs et je veux être en mesure de mettre leur nom d'utilisateur sur l'image. Je suis capable de faire cela très bien, mais comme les noms d'utilisateur sont de différentes longueurs et que je veux aligner le nom d'utilisateur à droite, Comment puis-je faire cela quand je dois définir des coordonnées x & Y.
$im = imagecreatefromjpeg("/path/to/base/image.jpg");
$text = "Username";
$font = "Font.ttf";
$black = imagecolorallocate($im, 0, 0, 0);
imagettftext($im, 10, 0, 217, 15, $black, $font, $text);
imagejpeg($im, null, 90);
5 réponses
Utiliser le imagettfbbox fonction pour obtenir la largeur de la chaîne, puis de déduire de la largeur de l'image pour obtenir le départ abscisse.
$dimensions = imagettfbbox($fontSize, $angle, $font, $text);
$textWidth = abs($dimensions[4] - $dimensions[0]);
$x = imagesx($im) - $textWidth;
Vous pouvez utiliser stil/gd-texte classe. Avertissement: je suis l'auteur.
<?php
use GDText\Box;
use GDText\Color;
$im = imagecreatefromjpeg("/path/to/base/image.jpg");
$textbox = new Box($im);
$textbox->setFontSize(12);
$textbox->setFontFace("Font.ttf");
$textbox->setFontColor(new Color(0, 0, 0)); // black
$textbox->setBox(
50, // distance from left edge
50, // distance from top edge
200, // textbox width
100 // textbox height
);
// text will be aligned inside textbox to right horizontally and to top vertically
$textbox->setTextAlign('right', 'top');
$textbox->draw("Username");
vous pouvez aussi dessiner du texte en plusieurs langues. Suffit d'utiliser \n
dans la chaîne passée à draw()
méthode.
Exemple généré avec cette classe:
pré-calculer la taille du nom de l'utilisateur en utilisant imagettfbbox ().
à Partir de la largeur que vous obtenez à partir de là, vous pouvez alors déduire la position x à laquelle votre texte doit commencer.
ça va marcher...............
$s = split("[\n]+", $text);
$top=20;
$left=30;
$font_file="yourfont.ttf";
$fontsize=20;
$__H=$top;
foreach($s as $key=>$val){
$_b = imageTTFBbox($fontsize,0,$font_file,$val);
$_W = abs($_b[2]-$_b[0]);
$_X = ($left+$text_box_width)-$_W;
$_H = abs($_b[5]-$_b[3]);
$_H +=1;
$__H += $_H;
$res=imagettftext($image, $this->_fontsize, 0, $_X, $__H, $color, $font_file, $val);
$__H += 1;
j'ai amélioré le code sujithayur, et créé une fonction qui permet tous les aligns (Gauche, Centre, Droite) & (Haut, centre, milieu) et ses combinaisons. Il utilise également l'ombre du texte.
// $x is margin from left, in case of left align, and margin from right, in case of right horizontal align
// $alignHorizontal values can be 'left', 'center', 'right'
// $alignVertical values can be 'top', 'center', 'bottom'
function imagettftext_aligned($image, $fontSize, $x, $y, $color, $colorShadow, $fontPath, $text, $alignHorizontal, $alignVertical) {
$s = explode("\n", $text);
$imageWidth = imagesx($image);
$imageHeight = imagesy($image);
$top=$y;
$left=$imageWidth - $x;
$__H=$top; // default - top
$lineHeight = $fontSize + 14;
if ($alignVertical == 'bottom')
$__H = $imageHeight - $y - (count($s) * $lineHeight);
elseif ($alignVertical == 'center')
$__H = $imageHeight/2 - (count($s) * $lineHeight)/2;
foreach($s as $key=>$val){
$_b = imageTTFBbox($fontSize,0,$fontPath,$val);
$_W = abs($_b[2]-$_b[0]);
$_H = abs($_b[5]-$_b[3]);
$_H +=1;
if ($alignHorizontal == 'right')
$_X = $left - $_W;
elseif ($alignHorizontal == 'center')
$_X = $imageWidth/2 - $_W/2;
else // default - left
$_X = $x;
imagettftextblur($image, $fontSize, 0, $_X + 2, $__H + 2, $colorShadow, $fontPath, $val, 4); // 1 can be higher to increase blurriness of the shadow
imagettftextblur($image, $fontSize, 0, $_X, $__H, $color, $fontPath, $val);
$__H += $lineHeight + 1;
}
return ['bottom' => $__H];
}
// https://github.com/andrewgjohnson/imagettftextblur
if (!function_exists('imagettftextblur'))
{
function imagettftextblur(&$image,$size,$angle,$x,$y,$color,$fontfile,$text,$blur_intensity = null)
{
$blur_intensity = !is_null($blur_intensity) && is_numeric($blur_intensity) ? (int)$blur_intensity : 0;
if ($blur_intensity > 0)
{
$text_shadow_image = imagecreatetruecolor(imagesx($image),imagesy($image));
imagefill($text_shadow_image,0,0,imagecolorallocate($text_shadow_image,0x00,0x00,0x00));
imagettftext($text_shadow_image,$size,$angle,$x,$y,imagecolorallocate($text_shadow_image,0xFF,0xFF,0xFF),$fontfile,$text);
for ($blur = 1;$blur <= $blur_intensity;$blur++)
imagefilter($text_shadow_image,IMG_FILTER_GAUSSIAN_BLUR);
for ($x_offset = 0;$x_offset < imagesx($text_shadow_image);$x_offset++)
{
for ($y_offset = 0;$y_offset < imagesy($text_shadow_image);$y_offset++)
{
$visibility = (imagecolorat($text_shadow_image,$x_offset,$y_offset) & 0xFF) / 255;
if ($visibility > 0)
imagesetpixel($image,$x_offset,$y_offset,imagecolorallocatealpha($image,($color >> 16) & 0xFF,($color >> 8) & 0xFF,$color & 0xFF,(1 - $visibility) * 127));
}
}
imagedestroy($text_shadow_image);
}
else
return imagettftext($image,$size,$angle,$x,$y,$color,$fontfile,$text);
}
}