首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Imagick: queryFontMetrics()函数在windows和linux上给出了不同的结果

Imagick: queryFontMetrics()函数在windows和linux上给出了不同的结果
EN

Stack Overflow用户
提问于 2016-03-31 11:18:13
回答 1查看 933关注 0票数 0

php版本: 5.4.22

Imagick版本: 3.2.0RC1

我正在用queryFontMetrics()函数计算文本宽度。

我的守则:

代码语言:javascript
复制
<?php
$font = 'Arial.ttf';
$im = new \Imagick();              
$draw = new \ImagickDraw();                 
$draw->setFont($font);
$draw->setFontSize(10);

$text = 'Bathroom';  
$attriutes = $im->queryFontMetrics($draw, $text);
echo '<br>string : '.$text;
echo '<br>calculated width in pixel : '.$attriutes['textWidth'];

$text = 'TTTTTTTTT';  
$attriutes = $im->queryFontMetrics($draw, $text);
echo '<br>string : '.$text;
echo '<br>calculated width in pixel : '.$attriutes['textWidth'];
?>

Linux上的结果(Linuxubuntu3.16.0-23-泛型)

弦乐:浴室 计算宽度(像素):44.828125 字符串: TTTTTTTTT 计算宽度(像素):53.765625

windows 7的结果

弦乐:浴室 计算宽度(像素):47 字符串: TTTTTTTTT 计算宽度(像素):63

为什么会发生这种事?

php中还有其他库可以精确地计算文本宽度吗?

EN

回答 1

Stack Overflow用户

发布于 2016-03-31 12:44:12

在这个论坛上,我发现了这一点。

由于Arial是微软的版权字体,我们怀疑它在您的主机上是不可用的。如果没有,ImageMagick会选择每台机器上可能不同的默认字体。另一个不同之处是自由类型库。不同版本可能会为字体度量返回不同的结果。如果您的脚本在Linux主机上有ImageMagick 6.5.9-0和Freetype 2.3.11,并且它始终返回: x_ppem = 14 y_ppem = 14上升= 11下降= -4宽度=4高= 17 max_advance = 15 默认字体(因为Arial不可用)。

如果使用identify -list Type命令

你会得到这样的结果。

建议

characterWidth和characterHeight

  • 它们似乎与您为字体指定的大小有关,并且似乎每个字体都没有不同(相同大小)。因此,它们不是特别有用(至少对我来说)。它们并不是字体将使用多少空间的可靠指标。

爬升器

  • 上升点是字体中高于基线的部分。它与字符无关--字体中每个字符的上升值都是相同的。

下降区

  • 下划线是字体中低于基线的部分。它被表示为一个负数。将上升点和下降点的绝对值相加,您将得到.

textHeight

  • 这是字体可用的总高度。字体中的每个字符都是一样的,不管其大小或字符所占的空间有多大。这可以用来确定线的高度,当输出段落等。

textWidth

  • 此值因字符而异,是字符的宽度。如果boundingBox没有提供可用的值,这是有用的(参见下面的boundingBox )。当一个一个地定位字符时--不要使用textWidth,使用originX (见下文)。

maxHorizontalAdvance

  • 恐怕我还没有弄清楚这件事的目的。字体中的每个字符都是相同的。对于大小为67的Arial意大利字体,其值为89,比相同尺寸的M或W的预告值要宽得多。

boundingBox

  • 这将返回一个关联数组,该数组描述包含字符的矩形的四个点(x1、y1、x2、y2)。这些值相对于原点(即在图像中绘制字符的位置的坐标)。返回的矩形非常精确,并且完全包含打印字符的所有部分--但是boundingBox只对单个字符工作。它不会给出准确的数字为多个字符(在我的经验无论如何)。在绘制框时,需要将"x“值添加到原点,并从原点减去"y”值。空间字符不能依赖于boundingBox。它返回(0,0,0,0,0)的boundingBox。textWidth (见上文)在这里派上用场。

originX和originY

  • 这些是不准确的标题。在originX和originY中返回的值实际上是advanceX和advanceY。这些值给出下一个字符相对于当前字符的位置。

还请阅读此堆栈溢出quesion

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36331901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档