imagemagick - ImageMagick 中字体渲染缓慢

标签 imagemagick

我正在使用以下 ImageMagick 脚本(带有用于 PHP 的 Imagick)来生成字体图像。这个脚本用大约 0.1 秒来生成一个大约 30 个字符的 48 大小的图像。目标速度大约是 0.01 秒。恐怕切换到 GD 库可能是实现此目标的唯一方法(我读到 here 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。相反,我切换到 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']);

您会注意到还有一些其他不错的功能。例如,不必通过创建 ImagickPixel 对象来定义颜色,大多数函数只需将颜色作为字符串即可。此外,函数名称在 GraphicsMagick 中似乎更加自洽(annotate 而不是 annotation)。不用说,我对此非常满意。

关于imagemagick - ImageMagick 中字体渲染缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11606654/

相关文章:

python - 使用命令行工具组合多个图像

imagemagick - ImageMagick 是覆盖图像的最快方法吗?我如何才能做得更快,或者是否有我不知道的更快的技术?

java - 使用 java 执行 imagemagick 命令没有输出

linux - 安装哪个jpeg delegate,CentOS的安装步骤是什么?

imagemagick - 使用 imagemagick 转换为 pdf 时如何管理图像位置?

php - Imagemagick设置行间距?

perl - 如何使用 Image::Magick 调整图像大小以适合区域?

php - 使用 Imagick 在 JPG 上叠加 PNG

从图像创建数组

imagemagick - 并排合并图像(水平)