2

次の ImageMagick スクリプト (PHP 用の Imagick を使用) を使用して、フォントのイメージを生成しています。このスクリプトは、サイズ 48 で約 30 文字の画像を生成するのに約 0.1 秒かかります。目標速度は約 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']);
4

1 に答える 1

7

答えライブラリを切り替えることでしたが、GD ではありませんでした。むしろ、効率と最適化に重点を置いた ImageMagick のフォークであるGraphicsMagickに切り替えました。GraphicsMagick の Web サイトによると、Flickr や Etsy など、世界最大の写真サイトで使用されています。次の GraphicsMagick コードは、対応する ImageMagick コードよりも約10 倍高速に実行され、1 回の操作で 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ではなくannotate )。言うまでもなく、私はそれにとても満足しています。

于 2012-07-24T16:33:58.537 に答える