【问题标题】:Is there a way to tell whether a font supports a given character in Imagick?有没有办法判断字体是否支持 Imagick 中的给定字符?
【发布时间】:2014-01-03 23:31:11
【问题描述】:

我正在使用Imagick 生成简单的徽标,它们只是背景上的文字。

我通常会遍历所有可用的字体,以向用户展示每种字体的不同渲染选择(每种字体一个图像)。

问题是,有些字体不支持 ASCII 字符(我认为它们是为给定语言设计的)。而且我猜一些支持 ASCII 字符的字体也会因非 ASCII 字符而失败。

不管怎样,我最终得到了这样的图像:

Imagick 中是否有编程方式来判断给定字体是否支持给定字符串中的所有字符?

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

【问题讨论】:

  • 在谷歌上搜索了一下之后,看起来很可疑 - 看来你必须直接解析字体文件,这不是微不足道的。
  • @Pekka웃 我肯定会避免这样做...也许除了 Imagick 之外还有其他库可以查询 TTF 字体,希望有人能对此有所了解!
  • 理论上你可以画出不支持的字符,然后将你感兴趣的字符与那个字符进行比较。如果它们匹配每个像素的像素,则可能也不支持其他字符。如果您设法做到这一点,您可以自动构建缓存文件、映射字体和支持的字符。这可能不是您所追求的,Pekka 和 Dave 的建议似乎更合理。此外,如果不支持的字符被打印为问号,这可能会失败。
  • @Mikk 这是个好主意!我考虑过测量结果字符的宽度(例如使用imagettfbbox()),但这可能会出错。实际上比较结果要好得多。
  • 替换字符在 Unicode 标准中位于代码点 U+FFFD(矩形和/或问号)。所以你可以用它来比较。不过想想,你还不如把A和B比较一下。如果它们相同,那么字体就没有用了。

标签: php fonts imagick


【解决方案1】:

我不知道使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2022-01-21
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多