是否可以使用ImageMagick中的字体系列渲染字体?
我已经尝试了所有我能想到的东西,但似乎没有任何效果。我做了很多搜索,似乎无法找到解决这个特定问题的任何内容。
我最终使用PHP,但我也尝试在命令行上使用ImageMagick但没有成功。我在linux上使用ImageMagick 6.7.6。这是我到目前为止所做的。
identify -list font
命令以下是我测试过的某些字体的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
但是,当我尝试使用字体系列(由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应尝试使用的字体系列 用于渲染文本。如果可以找到它的家庭,则使用它;如果没有,a 默认字体(例如,“Arial”)或已知类似的家族是 如果请求“系统”,则可以使用替换(例如,“Courier”) 但没有找到。)
非常欢迎任何想法。我现在几乎陷入困境。
修改
我更喜欢使用字体系列而不是完全命名字体的主要原因是因为我正在处理的输入。我从第三方收到需要处理的文件。这些文件将字体指定为:
font-family="Honey Script" font-style="Normal" font-stretch="Normal" font-weight="300"
如果我必须根据该信息指定确切的字体名称,我需要为每个可能的字体系列和属性组合创建一个映射到确切的字体名称。由于数百种字体被添加到系统中,因此很难维护。
在我看来,必须有一种方法让ImageMagick根据上面列出的有关字体的所有可用细节检索确切的字体。
如果那是不可能的,那么为什么ImageMagick可以选择指定字体系列?
答案 0 :(得分:3)
这是将所有可用的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;
}
你应该看到这样的事情:
答案 1 :(得分:2)
这是由于字体系列的工作原理;例如,“Arial”字体系列包含粗体,斜体,下划线等特定字体定义。在选择要在图像中使用的字体时,您必须具体。
我猜如果你真的想要,你可以做以下事情:
-Regular
追加到最后,然后重试但是你不应该对字体系列进行任何编程操作,除非你被迫; - )
我的想象力知识来源主要来自这个人:http://valokuva.org/?cat=1