【问题标题】:PHP Imagick processing images takes long timePHP Imagick 处理图像需要很长时间
【发布时间】:2017-04-13 15:08:45
【问题描述】:

我正在处理 5MB - 6MB 的图像,并使用 PHP Imagick 将它们减小到 600KB 以下的文件大小。通常一次在 3000 到 5000 之间。但是,该过程需要 8-12 小时才能完成。我尝试了两种不同的处理方式:1) 使用 Guzzle Pool 远程检索图像并将它们存储在本地,然后运行转换过程,以及 2) 远程检索图像并存储在 ImageMagick 对象中,处理它们,然后在本地保存。这两种方法似乎都需要花费大量时间才能完成。两种方法在下面调整图像大小并保存它们的过程是相同的,除了从文件中读取图像,如果我已经将它保存在本地。

$imagick = new Imagick();
$imagick->readImageBlob($source);
$imagick->setImageFormat('jpg');
$imagick->setOption('jpeg:extent', '600kb');
$imagick->stripImage();
$imagick->writeImage($destination);

想知道是否还有其他方法可以加快速度。

【问题讨论】:

  • Imagick 有点慢且资源匮乏……如果您只是调整图像大小,您可以尝试使用 GD 库来代替 - 它不太复杂但速度更快。实际上,将图像复制到本地机器并通过 Perl 的系统调用使用 Imagick 处理它们比 PHP 更快。
  • 据我了解,imagick 的 jpeg:extent 会尝试不同的压缩级别,直到达到所需的文件大小(请参阅this answer)。您可以采取任何措施来缩短该过程,这将有助于提高速度。您是否也只是减小文件大小或像素尺寸?
  • @CD001 - 根据我的阅读和一些测试,使用命令行并不能提供任何速度。
  • @DaveP - 仅文件大小。感谢您使用维度一词。尝试搜索文件大小会引发很多维度讨论,很难筛选出来。

标签: php imagemagick


【解决方案1】:

我有几个建议,如果您愿意,您也可以将它们组合在一起。如果您在问题中指定了操作系统以及图像类型,那将会有所帮助...

第一个建议 - 并行处理

使用 GNU Parallel 并行执行它们。所以而不是下面的顺序代码:

for f in *.png; do
    ./Process "$f"
done

你会这样做:

parallel ./Process {} ::: *.png

第二个建议 - 使用 “负载收缩”

如果您要减小图像的像素尺寸,例如,从 5,000x3,000 像素到 800x600 像素,并且它们是 JPEG,您可以使用 "shrink on load"

 magick -define jpeg:size=1600x1200 BigBoy.jpg -define jpeg:extent=600kb BiteSize.jpg

考虑vips

考虑使用vips,我怀疑它会更快、更省资源

vipsthumbnail BigBoy.jpg -s 800x600 -o BiteSize.jpg

在上面的命令中添加--vips-leak,看看它使用了多少内存。

【讨论】:

  • 这是在 Ubuntu 上,即将成为 CentOS。我只是将文件大小减少到 600K 或以下,而不是尺寸。我的问题是可以对文件大小进行“加载收缩”吗? GNU 并行是否意味着我将同时运行 3000-5000 个进程并杀死我的服务器?至于 VIPS,我们确实使用它在另一台服务器上创建平铺图像。我没有发现任何关于文件大小的信息。你知道什么吗?
  • “加载时收缩” 仅适用于减小像素尺寸。使用 GNU Parallel,除非您另有说明,否则它将在每个 CPU 核心启动一个进程,因此如果您有一台 8 核服务器,它将保持 8 个进程运行,直到您完成所有工作。尝试使用vips 标记您的问题,John(作者)@user894763 或许能够分享他丰富的知识和见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多