所以我想借鉴我的图像文字,在这个例子中说“Trevor,24”
但我想使用Helvetica字体为Trevor,而对于24我想使用字体Arial.但我希望它在同一条线上,看起来像是一条线.
是否有可能或者我将如何制作它以便即使我改变名称和年龄,我可以像这样打印出来?
“特雷弗,(Helvetica)24(阿里尔)”
我会假设将它们打印在彼此旁边,但是如果有人输入的名字比Trevor 24更长,那么就会过去.
我们的想法是让它在同一条线上
你们有什么感想?
$draw = new ImagickDraw();
$color = new ImagickPixel('#5b5b5b');
$bgcolor = new ImagickPixel('none');
$font = 'Helvetica';
//$draw->setFont($font);
//$draw->setFontSize(39);
$draw->setFillColor($color);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);
$draw->setFont($font);
$draw->setFontSize(39);
$text = 'Trevor, 24';
$draw->setGravity(Imagick::GRAVITY_WEST);
$image->annotateImage($draw, 50, 241, 0, $text);
解决方法:
这很容易,但你必须做一些工作.使用Imagick::queryFontMetrics跟踪每种字体的绘图宽度,并简单地偏移到X坐标以确保对齐均匀.
// Let's create a generator to simplify context management (YMMV)
function context_generator() {
$text = array('Trevor (Helventica)',' 24 (Impact)');
$font = array('Helvetica', 'Impact');
foreach($text as $k => $v ) yield [$font[$k], $v];
}
$image = new Imagick();
$image->newImage(450, 100, "steelblue", "png");
$draw = new ImagickDraw();
$draw->setFillColor('black');
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);
$draw->setFontSize(24);
$x = $y = 40;
foreach(context_generator() as $attr) {
// Set context typeface
$draw->setFont($attr[0]);
// Calculate how big this type face will be (and any validation to protect overflow)
$metrics = $image->queryFontMetrics($draw, $attr[1], FALSE);
// Draw part
$image->annotateImage($draw, $x, $y, 0, $attr[1]);
// Offset origin X
$x += $metrics['textWidth'];
}
当然,上面的例子可以简化&降低.
标签:imagemagick-convert,imagick,php,imagemagick
来源: https://codeday.me/bug/20191007/1867027.html