Imagick中有一种方法可以判断字体是否支持给定字符吗?

18

我正在使用Imagick来生成简单的标志,这些标志只是背景上的文本。

通常我会遍历所有可用的字体,为每种字体呈现不同的渲染方式(每个字体一个图像)。

问题在于,有些字体不支持ASCII字符(我认为它们只针对特定语言进行了设计)。而且我想一些支持ASCII字符的字体也会因为非ASCII字符而失败。

总之,我最终得到了这样的图像:

Imagick不支持的字体字符 Imagick不支持的字体字符 Imagick不支持的字体字符

Imagick中有没有编程方法可以判断给定的字体是否支持给定字符串中的所有字符?

这将帮助我过滤掉不支持用户输入文本的字体,并避免显示任何垃圾图像,例如上面的图像。


经过一番谷歌搜索,看起来很难确定 - 似乎你必须直接解析字体文件,这并不容易。 - Pekka
可能不是用PHP编写的。在*nix命令行中有工具:从Ubuntu上的字体*.ttf文件获取支持的Unicode范围但显然它们也不是100%可靠的。 - Pekka
2
理论上,您可以绘制不确定是否支持的字符,并将您感兴趣的字符与该字符进行比较。如果它们逐像素匹配,则其他字符可能也不受支持。如果您成功完成此操作,则可以自动构建缓存文件、映射字体和支持的字符。这可能不是您想要的,Pekka和Dave的建议似乎更合理。此外,如果不支持的字符被打印为问号,这可能会失败。 - Mikk
1
@Mikk 那是个好主意!我曾考虑过测量生成字符的宽度(例如使用imagettfbbox()),但那样会有缺陷。实际上比较结果更好。 - Pekka
1
替换字符在Unicode标准中的代码点是U+FFFD(矩形和/或问号符号)。因此,您可以使用它进行比较。但是思考一下,你也可以将A和B进行比较。如果它们相同,则该字体无用。 - allcaps
显示剩余4条评论
1个回答

2
我不知道使用imagemagik的方法,但是你可以使用这里的php-font-parser库:

https://github.com/Pomax/PHP-Font-Parser

具体而言,您可以解析所需字符串中的每个字母的字体,并检查返回值:
    $fonts = array("myfont.ttf");

    /**
     * For this test, we'll print the header information for the
     * loaded font, and try to find the letter "g".
     */
    $letter = "g";
    $json = false;
    while($json === false && count($fonts)>0) {
            $font = new OTTTFont(array_pop($fonts));
            echo "font header data:\n" . $font->toString() . "\n";
            $data = $font->get_glyph($letter);
            if($data!==false) {
                    $json = $data->toJSON(); }}

    if($json===false) { die("the letter '$letter' could not be found!"); }
    echo "glyph information for '$letter':\n" . $json;

上述代码来自字体解析器项目的fonttest.php类:

https://github.com/Pomax/PHP-Font-Parser/blob/master/fonttest.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接