2012-07-23 88 views
1

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

$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']); 

回答

5

答案切换库,而不是GD。相反,我切换到GraphicsMagick,这是ImageMagick的一个分支,侧重于效率和优化。据GraphicsMagick网站称,它被世界上一些最大的照片网站使用,包括Flickr和Etsy。下面GraphicsMagick工具的代码运行速度比相应的ImageMagick的代码,这让我打我的每个操作0.01秒目标快约10倍(实际上它更接近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']); 

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

+1

好主,今晚有这个答案救了我的屁股。 Gmagick的文档非常糟糕,例子很少。感谢您演示一种测量渲染文本宽度的非常简单的方法! – 2012-12-10 05:15:26

+1

很高兴有人对我有帮助 - 我以为我是唯一一个在乎的人:-) – 2012-12-10 06:10:12

+0

我会尽量记住在这里分享这个项目:用户制作可怕的圣诞毛衫!我需要将文本合并到服务器端FAST的边界框中。这让我在那里文档失败。 – 2012-12-10 06:18:06