ImageMagick中的慢速字体渲染

ImageMagick中的慢速字体渲染,imagemagick,Imagemagick,我使用下面的ImageMagick脚本(使用Imagick for PHP)生成字体的图像。此脚本大约需要0.1秒来生成大小为48的约30个字符的图像。目标速度约为0.01秒。我担心切换到GD库可能是实现这一点的唯一方法(我了解到GD中的文本生成要快得多)。但是,如果没有重力和修剪等功能,使用GD生成这种类型的图像要麻烦得多。是否有人在这段代码中看到了明显的瓶颈,或者是时候切换库了 $image = new Imagick(); $draw = new ImagickDraw(); $backg

我使用下面的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']);
答案是切换库,而不是GD。相反,我转向了ImageMagick,这是一个专注于效率和优化的分支。据GraphicsMagick网站称,包括Flickr和Etsy在内的一些世界最大的照片网站都在使用它。以下GraphicsMagick代码的运行速度大约是相应ImageMagick代码的10倍,这使我能够达到每次操作0.01秒的目标(实际上接近0.008秒):


你会注意到还有其他一些不错的特性。例如,大多数函数不必通过创建
ImagickPixel
对象来定义颜色,而只是将颜色作为字符串。此外,函数名在GraphicsMagick(注释而非注释)中似乎更为自一致。不用说,我对此很满意。

天哪,这个答案今晚救过我吗。关于Gmagick的文档糟糕透顶,示例也很少。感谢您演示了一种非常简单的测量渲染文本宽度的方法!很高兴它对某人有帮助-我想我是唯一关心的人:-)当项目完成后,我会尽量记住在这里分享这个项目:用户生成的可怕的圣诞毛衣!我需要将文本适应一个边界框,服务器端,快速。这让我明白了文档失败的地方。@AaronAdams度量呈现文本宽度的代码在哪里?@Nir–因此,对于答案,
$image->getimagewidth()
$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']);