【问题标题】:Slow font rendering in ImageMagickImageMagick 中的字体渲染缓慢
【发布时间】:2012-07-25 00:33:58
【问题描述】:

我正在使用以下 ImageMagick 脚本(使用 Imagick for PHP)来生成字体图像。这个脚本需要大约 0.1 秒来生成大小为 48 的大约 30 个字符的图像。目标速度约为 0.01 秒。恐怕切换到 GD 库可能是实现这一目标的唯一方法(我读过here GD 中的文本生成要快得多)。但是,如果没有重力和修剪等功能,使用 GD 生成这种类型的图像要麻烦得多。有没有人看到这段代码有明显的瓶颈,或者是时候切换库了吗?

$image = new Imagick();
$draw = new ImagickDraw();
$background = new ImagickPixel('none');
$draw->setFont($font);
$draw->setFontSize($size);
$draw->setFillColor(new ImagickPixel('#'.$color));
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->annotation(0, 0, $text);
$image->newImage(5*mb_strlen($text, 'UTF-8')*$size, 5*$size, $background);
$image->setImageFormat('png');
$image->drawImage($draw);
$image->trimImage(0);
$image->writeImage($path_server['dirname'].'/'.$path_server['basename']);

【问题讨论】:

    标签: imagemagick


    【解决方案1】:

    答案切换库,而不是 GD。相反,我切换到GraphicsMagick,它是 ImageMagick 的一个分支,专注于效率和优化。根据 GraphicsMagick 网站,包括 Flickr 和 Etsy 在内的一些世界上最大的照片网站都在使用它。以下 GraphicsMagick 代码的运行速度比相应的 ImageMagick 代码快 10 倍,这让我达到了每次操作 0.01 秒的目标(实际上更接近 0.008 秒):

    $image = new Gmagick();
    $draw = new GmagickDraw();
    $draw->setfont($font);
    $draw->setfontsize($size);
    $draw->setfillcolor('#'.$color);
    $draw->setgravity(Gmagick::GRAVITY_CENTER);
    $draw->annotate(0, 0, mb_ereg_replace('%', '%%', $text));
    $image->newimage(5*mb_strlen($text)*$size, 5*$size, 'none', 'png');
    $image->drawimage($draw);
    $image->trimimage(0);
    $image->writeimage($path_server['dirname'].'/'.$path_server['basename']);
    

    您会注意到还有一些其他不错的功能。例如,大多数函数不必通过创建ImagickPixel 对象来定义颜色,而是简单地将颜色作为字符串。此外,GraphicsMagick 中的函数名称似乎更加自洽(annotate 而不是 annotation)。不用说,我很满意。

    【讨论】:

    • 天哪,今晚这个答案有没有救过我。 Gmagick 上的文档 hideously 很糟糕,而且示例很少。感谢您展示了一种非常简单的方法来测量渲染文本的宽度!
    • 很高兴它对某人有所帮助 - 我以为我是唯一关心的人:-)
    • 我会尽量记住在完成后在这里分享这个项目:用户生成的丑陋圣诞毛衣!我需要将文本适合边界框,服务器端,FAST。这让我到达了文档失败的地方。
    • @AaronAdams 测量渲染文本宽度的代码在哪里?
    • @Nir php.net/manual/en/gmagick.getimagewidth.php - 所以在答案的情况下,$image->getimagewidth()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2020-12-06
    • 2018-03-06
    • 2017-01-30
    • 2021-06-04
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多