9

是否可以使用 ImageMagick 中的字体系列渲染字体?

我已经尝试了我能想到的一切,但似乎没有任何效果。我做了很多搜索,似乎找不到任何可以解决这个特定问题的东西。

我最终使用的是 PHP,但我也尝试在命令行上使用 ImageMagick,但没有成功。我在 Linux 上使用 ImageMagick 6.7.6。这是我到目前为止所做的。

  • identify -list font我已经使用命令测试了 ImageMagick 识别的字体
  • 我根据系统上安装的 xml 文件手动创建了一个 type.xml 文件
  • 我使用这个脚本创建了一个 type.xml 文件: imagick_type_gen
  • 我测试过多种字体类型:ttf、otf、pfb、ttc

identify -list font这是我测试过的一些字体的示例输出:

Font: DejaVu-Sans-Book
  family: DejaVu Sans
  style: Normal
  stretch: Normal
  weight: 400
  glyphs: /usr/share/fonts/dejavu/DejaVuSans.ttf

Font: Baskerville-Regular
  family: Baskerville
  style: Normal
  stretch: Normal
  weight: 400
  glyphs: /usr/share/fonts/custom/Baskerville.ttc

Font: Palatino-Roman
  family: Palatino
  style: Normal
  stretch: Normal
  weight: 400
  glyphs: /usr/share/fonts/urw-fonts/p052003l.pfb

Font: Honey-Script-Light
  family: Honey Script
  style: Normal
  stretch: Normal
  weight: 300
  glyphs: /usr/share/fonts/custom/HoneyScript-Light.ttf


如果我指定完整的字体名称,一切都会按预期工作:

convert -pointsize 32 -font "Honey-Script-Light" label:'Testing' testing.png

在职的


但是,当我尝试使用字体系列(由 type.xml 列出identify -list font和在 type.xml 中列出)时,我得到了默认的系统字体:

convert -pointsize 32 -family "Honey Script" label:'Testing' testing.png

不工作


我也尝试指定所有字体的参数,但它再次不起作用:

convert -pointsize 32 -stretch Normal -style Normal -weight 300 -family "Honey Script"   label:'Testing' testing.png



当我通过 PHP 执行类似的过程时,实际上只要我尝试设置绘图对象的字体系列,它就会返回错误。

$draw->setFontFamily('Honey Script');

这是引发的错误:

PHP Fatal error:  Uncaught exception 'ImagickDrawException' with message 'Unable to set font family; parameter not found in the list of configured fonts



就像命令行选项一样,如果我指定完整的字体名称,图像就会正确呈现。

$draw->setFont('Honey-Script-Light');



从我发现的有关如何配置要与 ImageMagick 一起使用的字体的所有内容中,确实配置了字体。为什么我不能根据字体系列选择字体?

这可能是一个未记录的错误吗?有什么我想念的吗?

我意识到我可以简单地指定完整的字体名称并完成它,但有一个特定于我的项目的原因使得指定字体系列更好。

如果它不起作用,为什么要指定字体系列?这就是 ImageMagick 关于字体系列选项的说法:

此设置建议 ImageMagick 应尝试使用字体系列来呈现文本。如果可以找到家庭,则使用它;如果不是,则替换默认字体(例如,“Arial”)或已知相似的系列(例如,如果请求“System”但未找到,则可能使用“Courier”)。

任何想法都非常受欢迎。我几乎被困在这一点上。


编辑:
我更喜欢使用字体系列而不是完全命名的字体的主要原因是因为我正在处理的输入。我从第三方收到需要处理的文件。这些文件将字体指定为:

font-family="Honey Script" font-style="Normal" font-stretch="Normal" font-weight="300"

如果我必须根据该信息指定确切的字体名称,我需要为字体系列和属性的每个可能组合创建一个映射到确切的字体名称。由于数百种字体被添​​加到系统中,这将很难维护。

在我看来,必须有一种方法可以让 ImageMagick 根据上面列出的有关字体的所有可用详细信息来检索确切的字体。

如果那不可能,那么为什么 ImageMagick 可以选择指定字体系列呢?

4

2 回答 2

4

这是将所有可用的 Imagick 字体作为图像输出(到浏览器中)的方法

 public function test_fonts(){
    //load background
    $im = new Imagick();
    $im->newimage(800, 10000, 'lightgray');
    $y = 10;
    $i = 1;
    foreach($im->queryFonts() as $font){
        $insert_image = new Imagick();
        $insert_image->newImage(600, 30, 'whitesmoke');
        $insert_image->setImageFormat("png");
        $draw = new ImagickDraw();
        $draw->setFont($font);
        $draw->setFontSize(25);
        $draw->setFillColor(new ImagickPixel('black'));
        $draw->setgravity(imagick::GRAVITY_NORTH);
        $insert_image->annotateImage($draw, 0, 0, 0, $i . '.' .  $font );
        $im->compositeImage( $insert_image,  $insert_image->getImageCompose(),100, $y);
        $y += 30;
        $i++;
    }
    $im->setImageFormat('jpg');
    header('Content-Type: image/jpg');
    echo $im;

}

您应该看到如下内容: 在此处输入图像描述

于 2014-11-06T09:34:10.890 回答
2

这是由于字体系列的工作方式。例如,“Arial”字体系列包括粗体、斜体、下划线等的特定字体定义。在选择要在图像中使用的字体时,您必须具体。

我猜如果你真的想要,你可以这样做:

  1. 取字体系列名称,用破折号替换空格
  2. 如果这行得通,那就太好了!
  3. 如果没有,追加-Regular到最后再试一次

但是你不应该对字体系列做任何程序化的事情,除非你被迫;-)

我的 imagick 知识来源主要来自这个人:http://valokuva.org/?cat= 1

于 2012-05-14T03:39:35.420 回答