ImagickDraw::annotation

(PECL imagick 2, PECL imagick 3)

ImagickDraw::annotation在图像上绘制文本

描述

public ImagickDraw::annotation(float $x, float $y, string $text): bool
警告

此函数当前未记录;仅提供其参数列表。

在图像上绘制文本。

参数

x

绘制文本的 x 坐标

y

绘制文本的 y 坐标

text

要在图像上绘制的文本

返回值

不返回值。

添加注释

用户贡献的注释 5 个注释

15
use_contact_form at Jonas-Kress dot de
15 年前
可能对某人有所帮助...

<?php
/**
* 将给定文本拆分为适合给定 maxWidth 的行
*
* @param unknown_type $draw
* @param unknown_type $text
* @param unknown_type $maxWidth
* @return array
*/
private function getTextRows($draw, $text, $maxWidth)
{
$words = explode(" ", $text);

$lines = array();
$i=0;
while (
$i < count($words))
{
//只要有词

$line = "";
do
{
//将单词追加到行,直到它们适合大小
if($line != ""){
$line .= " ";
}
$line .= $words[$i];


$i++;
if((
$i) == count($words)){
break;
//最后一个词 -> 退出循环
}

//测量行的大小 + 下一个词的大小
$linePreview = $line." ".$words[$i];
$metrics = $this->canvas->queryFontMetrics($draw, $linePreview);
//echo $line."($i)".$metrics["textWidth"].":".$maxWidth."<br>";

}while($metrics["textWidth"] <= $maxWidth);

//echo "<hr>".$line."<br>";
$lines[] = $line;
}

//var_export($lines);
return $lines;
}
?>
9
Anonymous
14 年前
以下是如何创建标题图像并将其写入文件。我花了一段时间才弄清楚。我希望这有帮助。

<?php

/* 要写入的文本 */
$text = "Hello World!";

/* 创建 Imagick 对象 */
$image = new Imagick();
$draw = new ImagickDraw();
$color = new ImagickPixel('#000000');
$background = new ImagickPixel('none'); // 透明

/* 字体属性 */
$draw->setFont('Arial');
$draw->setFontSize(50);
$draw->setFillColor($color);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);

/* 获取字体度量 */
$metrics = $image->queryFontMetrics($draw, $text);

/* 创建文本 */
$draw->annotation(0, $metrics['ascender'], $text);

/* 创建图像 */
$image->newImage($metrics['textWidth'], $metrics['textHeight'], $background);
$image->setImageFormat('png');
$image->drawImage($draw);

/* 保存图像 */
file_put_contents('/path/to/file.png', $image);
?>
0
daniel at justathought dot net
2 个月前
[如另一个评论中所述] 要在使用 `annotation()` 时在垂直平面内正确定位文本,可以使用 `Imagick::queryFontMetrics()` 返回的 `"ascender"` 元素的值。

因此,为了有效地使您的文本触及 [0, 0],例如,您可以执行以下操作。

<?php
$textDraw
= new ImagickDraw();
$textDraw->setFont($fontPathname);
$textDraw->setFontSize($fontSize);
$textDraw->setFillColor(new ImagickPixel($color));

$imagick= new Imagick();
$textMetrics = $imagick->queryFontMetrics($textDraw, 'Hello, World!');

$textDraw->annotation(
0,
$textMetrics['ascender'], // <-- 这是重要的部分 :-)
'Hello, World!'
);
?>

希望这能澄清。另一条评论对我来说是一个祝福。
-1
匿名
15 年前
你可以使用此方法来分割你的文本,使其适合特定的 $maxWidth。

<?php
/**
* @param string $text
* @param int $maxWidth
*/
protected function _fitText($text, $maxWidth)
{
$im = new Imagick();
$im->newImage($this->_width, $this->_height, "none");

$lines = explode(PHP_EOL, trim($text));
$DEBUG_LOOP = 0;

for (
$k = 0; $k < count($lines); ++$k) {
do {
$drawText = new ImagickDraw();
// 在这里设置字体设置,如大小、字体系列等
$metrics = $im->queryFontMetrics($drawText, $lines[$k]);
$fits = $metrics["textWidth"] <= $maxWidth;

if (
$fits) {
break;
}

$pos = mb_strrpos($lines[$k], " ");
if (
$pos === false) {
throw new
RuntimeException("无法使其适合");
}
if (!isset(
$lines[$k + 1])) {
$lines[$k + 1] = null;
}
$lines[$k + 1] = trim(mb_substr($lines[$k], $pos + 1) . " " . $lines[$k + 1]);
$lines[$k] = trim(mb_substr($lines[$k], 0, $pos));

if (++
$DEBUG_LOOP >= 200) {
throw new
RuntimeException("无限循环");
}
} while (!
$fits);
}
$text = implode(PHP_EOL, $lines);
$drawText = new ImagickDraw();
// 再次设置字体设置,如大小、字体系列等!
$metrics = $im->queryFontMetrics($drawText, $text);
$metrics["text"] = $text;
assert('$metrics["textWidth"] <= $maxWidth');
return
$metrics;
}
?>
-1
web at synaptech dot fr
11 年前
在某些情况下,(自定义)字体可能会在侧面被截断,特别是手写字体。
为了改进上面匿名关于“如何创建标题图片”的注释,我改变了代码的这部分

<?php
/* 创建文本 */
$draw->annotation( $metrics['boundingBox']['y2'], $metrics['ascender'], $text );

/* 创建图片 */
$image->newImage( $metrics['textWidth'] + $metrics['boundingBox']['y2'], $metrics['textHeight'], $background );
?>
To Top