ImageMagick中的慢速字体渲染

Dav*_*nes 1 imagemagick

我正在使用以下ImageMagick脚本(使用Imagick for PHP)生成字体图像.该脚本大约需要0.1秒才能生成大小为48的大约30个字符的图像.目标速度大约为0.01秒.我担心切换到GD库可能是实现这一目标的唯一方法(我在这里读到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']);
Run Code Online (Sandbox Code Playgroud)

Dav*_*nes 6

答案是切换库,但不是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']);
Run Code Online (Sandbox Code Playgroud)

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

  • 天哪,今晚这个答案有没有救过我的屁股。Gmagick 的文档非常糟糕,而且例子很少。感谢您演示了一种非常简单的测量渲染文本宽度的方法! (2认同)
  • 很高兴这对某人有帮助——我以为我是唯一关心的人:-) (2认同)