Imagick 在指定区域将文本置于图像上方
Imagick center text over image in specified area
我正在使用 Imagick 库在图像上添加文本。
我在图像上定义了区域 from x:280 to x:400
我正在该区域编写文本,我想将该文本居中对齐,以下代码居中文本 x:1 和 x:400
$draw = new ImagickDraw();
$draw->setFillColor('white');
$draw->setFont($tffFile);
$draw->setTextAlignment(Imagick::ALIGN_CENTER);
$draw->setFontSize( 14 );
$image->annotateImage($draw, 280, 80, 0, 'Hey there');
要使感兴趣区域内的文本居中,您需要在应用 Imagick::annotateImage
之前负责计算坐标。幸运的是,为此提供了 Imagick::queryFontMetrics
,正如您所观察到的,使用 setTextAlignment
更有可能使事情复杂化,然后再提供帮助。
// Given a basic pseudo image.
$image = new Imagick();
$image->newPseudoImage(400, 400, 'PLASMA:');
// Let's define a ROI rectangle.
$rect = [
'x' => 225,
'y' => 225,
'h' => 100,
'w' => 100,
];
// Draw a Region-of-interest for reference.
$roi = new ImagickDraw();
$roi->setStrokeColor('RED');
$roi->setStrokeWidth(2);
$roi->setFillColor('TRANSPARENT');
$roi->rectangle($rect['x'],
$rect['y'],
$rect['x'] + $rect['w'],
$rect['y'] + $rect['h']);
$image->drawImage($roi);
// Define your text-rendering context.
$ctx = new ImagickDraw();
$ctx->setFillColor('WHITE');
$ctx->setFontSize( 14 );
// Query who it will render with the image stack.
$metrics = $image->queryFontMetrics($ctx, 'Hey there');
// Adjust starting x,y as needed to meet your requirements.
$offset = [
'x' => $rect['x'] + $rect['w'] / 2 - $metrics['textWidth'] / 2,
'y' => $rect['y'] + $rect['h'] / 2 + $metrics['textHeight'] / 2 + $metrics['descender'],
];
// Draw text.
$image->annotateImage($ctx,
$offset['x'],
$offset['y'],
0,
'Hey there');
// Write to disk.
$image->writeImage('output.png');
使用自动换行和混合字体会使事情变得有点复杂。
我正在使用 Imagick 库在图像上添加文本。
我在图像上定义了区域 from x:280 to x:400
我正在该区域编写文本,我想将该文本居中对齐,以下代码居中文本 x:1 和 x:400
$draw = new ImagickDraw();
$draw->setFillColor('white');
$draw->setFont($tffFile);
$draw->setTextAlignment(Imagick::ALIGN_CENTER);
$draw->setFontSize( 14 );
$image->annotateImage($draw, 280, 80, 0, 'Hey there');
要使感兴趣区域内的文本居中,您需要在应用 Imagick::annotateImage
之前负责计算坐标。幸运的是,为此提供了 Imagick::queryFontMetrics
,正如您所观察到的,使用 setTextAlignment
更有可能使事情复杂化,然后再提供帮助。
// Given a basic pseudo image.
$image = new Imagick();
$image->newPseudoImage(400, 400, 'PLASMA:');
// Let's define a ROI rectangle.
$rect = [
'x' => 225,
'y' => 225,
'h' => 100,
'w' => 100,
];
// Draw a Region-of-interest for reference.
$roi = new ImagickDraw();
$roi->setStrokeColor('RED');
$roi->setStrokeWidth(2);
$roi->setFillColor('TRANSPARENT');
$roi->rectangle($rect['x'],
$rect['y'],
$rect['x'] + $rect['w'],
$rect['y'] + $rect['h']);
$image->drawImage($roi);
// Define your text-rendering context.
$ctx = new ImagickDraw();
$ctx->setFillColor('WHITE');
$ctx->setFontSize( 14 );
// Query who it will render with the image stack.
$metrics = $image->queryFontMetrics($ctx, 'Hey there');
// Adjust starting x,y as needed to meet your requirements.
$offset = [
'x' => $rect['x'] + $rect['w'] / 2 - $metrics['textWidth'] / 2,
'y' => $rect['y'] + $rect['h'] / 2 + $metrics['textHeight'] / 2 + $metrics['descender'],
];
// Draw text.
$image->annotateImage($ctx,
$offset['x'],
$offset['y'],
0,
'Hey there');
// Write to disk.
$image->writeImage('output.png');
使用自动换行和混合字体会使事情变得有点复杂。