2012-07-23 91 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