14
转变 \
   原始.jpg \
  -质量 85 \
  -色彩空间 RGB \
  -profile /var/tmp/sRGB.icm \
  -条 \
  -profile /var/tmp/sRGB.icm \
  -过滤兰佐斯\
  -写mpr:17JPCONV1-原始\
  +删除\
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '190x126!>' -write thumbWide.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '75x75!>' -write thumbStandard.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '163x163!>' -write hpSmall.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '1024x1019!>' -write jumbo.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '190x189!>' -write articleInline.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '2048x2037!>' -write superJumbo.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '592x589!>' -write tmagArticle.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '3000x2983!>' -write popup.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '640x640!>' -write square640.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '3000x1688!>' -write videoSmall.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '503x500!>' -write slide.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '151x151!>' -write moth.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '337x225!>' -write hpMedium.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '395x264!>' -write sfSpan.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '3000x1688!>' -write videoLarge.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '511x288!>' -write hpLarge.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '320x320!>' -write square320.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '600x338!>' -write articleLarge.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '3000x2000!>' -write videoThumb.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '150x150!>' -write thumbLarge.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '533x530!>' -write blog533.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '151x151!>' -write blogSmallInline.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '362x360!>' -write tmagSF.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '190x190!>' -writefilmstrip.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '480x478!>' -write blog480.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '427x425!>' -write blog427.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '50x50!>' -write blogSmallThumb.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1401+0+791' -resize '151x70!>' miniMoth.jpg;

我正在尝试使用一个命令从原始文件生成约 30 个作物(使用一个命令比对每个作物使用一个命令要快得多)。但是,这需要相当长的时间(约 30 秒)才能完成。有什么建议可以加快速度吗?调整大小命令可以通过 OpenCL 利用 GPU 吗?

更新:

  • 使用 -thumbnail 而不是 -resize 可以改善情况
  • (感谢@AR 的提示)使用 libjpeg-turbo 编译 ImageMagick 也将时间缩短了 20%
4

3 回答 3

34

您应该检查您的 ImageMagick 安装是否带有 OpenCL 支持:

convert -list configure | grep FEATURES

如果确实如此(就像我的一样),您应该会看到如下内容:

FEATURES      HDRI OpenCL

这个命令

convert -version 

还应该提供有关支持的功能的信息。

如果没有,您应该查看已编译的最新版本的 ImageMagick,该版本已编译 OpenCL 支持。或者如果您自己从源代码构建包,请确保使用 OpenCL。


更新:

等一下。还有另一个功能可以帮助您,称为OpenMP(用于多处理)。

启用 OpenMP 后,ImageMagick 命令可以在系统的所有内核上并行执行。因此,如果您有一个四核系统并调整图像大小,则调整大小发生在 4 个核心上(如果您有超线程,甚至是 8 个)。

您现在还可以使用内置-bench选项让 ImageMagick 为您的命令运行基准测试。例如:

convert logo: -resize 500% -bench 10 logo.png
  Performance[1]: 10i 0.689ips 1.000e 14.420u 0:14.510

此命令-resize 500%告诉 ImageMagick 运行convert命令以将内置 IMlogo:图像在每个方向上缩放 500%。该-bench 10部分告诉它在循环中运行相同的命令 10 次,然后打印性能结果:

  • 由于我没有启用 OpenMP,因此我只有 1 个线程 ( Performance[1]:)。
  • 它报告它运行了 10 次迭代 ( 10i)。
  • 速度接近每秒 0.7 次迭代 ( 0.689ips)。
  • 用户分配的总时间为 14.420 秒。

您应该使用以下命令了解您的系统是如何设置资源限制的:

识别 -list 资源
  文件区内存映射磁盘线程时间
  -------------------------------------------------- ------------------
   192 4.295GB 2GiB 4GiB 无限制 1 无限制

你可以看到我当前系统的设置(默认值——我没有调整它们)。列标题中的每个关键字都可以使用您的系统来拉皮条。

  • files定义 ImageMagick 将使用的最大同时打开的文件。
  • memory和资源限制以字节map为单位定义。要将它们设置为不同的值,您可以使用 SI 前缀,例如 500MB)。areadisk

如果我在这个系统上OpenMP for ImageMagick,我可以运行

convert -limit thread 2

为了启用 2 个并行线程,重新运行基准测试,看看它是否真的有所作为,如果有,有多少。我可以将限制设置为 4 甚至 8 并重复练习....


最后,您可以试验一下 ImageMagick 像素缓存的内部格式,称为MPC(Magick Pixel Cache)。有人说,对于大型操作,这里的性能会有所提高,但我没有个人经验。

首先将您的基础图片转换为 MPC:

convert input.jpeg input.mpc

然后才运行:

convert input.mpc [...your long-long-long list of crops...]

看看这是否可以大大节省您的时间。

很可能您甚至可以“内联”(使用特殊mpr:符号)使用这种 MPC 格式,类似于您应用使用将图像读入命名内存寄存器的mpr:格式(内存程序寄存器)的技巧。但是我从来没有尝试过这种技术来解决现实世界的问题,所以我不能说它在现实生活中是如何发挥作用的。


更新 2:

还有一个想法:

首先检查您的确切 ImageMagick 版本:运行convert -version

如果您的 ImageMagick 在其版本字符串中有一个Q16(或什Q32至或Q64)(意思是,它的内部进程认为所有图像都具有 16 位通道深度,与 相比,这需要双倍的内存Q8)——这是现在的默认值——你可以测试通过切换到 Q8 构建,您将获得哪些性能优势。(你会用质量损失来支付你的性能胜利,你必须检查你是否能忍受它......)

于 2012-07-30T19:47:58.377 回答
11

您的 CPU 时间将用于 3 个任务:

  • JPEG解压;
  • 调整大小;
  • JPEG再压缩

(裁剪本身可能需要你 1% 的时间。)

要解码 JPEG,只需执行一次,将结果保存在 RAM 中,然后重复用于每个输出。(详情如下。)这样,成本将是微不足道的。

要编码 JPEG,请使用 libjpeg-turbo;相同的 API,但如果您使用 x86-{32,64} 或 ARM 硬件,则加速 2-4 倍。

要调整大小,ImageMagick 以使用除了 PhotoShop 和 GIMP 之外的任何其他软件大约 100 倍的 CPU 而闻名。这包括所有照片查看器。它在每个像素上做多个三角函数,而其他人只做一个乘法。有时,如果您查看图像边缘附近的像素,您会发现 ImageMagick 选择了比其竞争对手更好的颜色。但是如果你认为 HTML5、Flash、Silverlight、Java、GD(流行于 Perl、PHP 和 Python 网络应用程序)等看起来不错,那么你不需要这种伪 AI(人工智能)。您也许可以将 GPU (OpenCL) 马力或更多 CPU (OpenMP) 投入 ImageMagick,但何必呢?

为了提高效率,ImageMagick(事实上的标准)的等价物是 Imlib2。它几乎可以在与 ImageMagick 一样多的操作系统/语言环境中使用。

您的“转换”shell 命令相当于调用 Imlib2 的 10-20 行高级语言:解压缩 JPEG,然后反复裁剪、调整大小和压缩 JPEG。

没有裁剪(或多个输出)的示例是: 使用 Perl 拉伸、调整大小或缩略图

如果您想要其他示例,请告诉我。

于 2012-07-30T23:17:02.467 回答
0

聚会迟到了,但如果有人有同样的问题,这是我目前的方法。 如果您要批量处理基本变换但要处理数千张图像,那么根据我的经验,您不会从 openMP 中获得太多好处,因为 openMP 对于“多核”大型复杂变换很有用。我的解决方案是一个 bash 脚本,用于并行生成各个进程。

#!/bin/bash
counter=0
for i in tif/*.TIF;
do
    y=${i%.TIF}
    ((counter++))
    if [ -s gif$y.gif ];then
        :
    else
        gm convert $i gif$y.gif &
    fi
    if [ $counter -eq 30 ];then 
        ((counter =0))
        wait
    fi
done
wait  

这会将“tif”目录中的所有 TIF 文件转换为“giftif”目录中的 gif。如果您必须停止此脚本,它将在下一次停止的地方继续。这会消耗我 MBP 中的所有 16 个内核,并且比单核方法快 12-14 倍,而我目前正在转换 150,000 张图像。

于 2016-09-02T16:03:48.213 回答