【问题标题】:How to chain image conversions with ImageMagick's convert command?如何使用 ImageMagick 的 convert 命令链接图像转换?
【发布时间】:2011-09-28 22:05:10
【问题描述】:

我有一个原始图像(例如,1600x1200),我想为其创建一系列具有各种分辨率的缩略图:

  • 900x0(即表示图像按比例缩放到 900 像素宽)
  • 700x0
  • 0x550(即表示图像按比例缩放到 550 像素高)
  • 0x400
  • 0x150
  • 200x200(即裁剪和居中)

就个人而言,我可以使用convert 命令处理这些转换中的每一个。问题是不断重新初始化convert是一种巨大的资源浪费;最好将事物链接起来,以便convert 可以重用其工作。

使用 ImageMagick 6.7.0-10 我尝试了以下方法(使用 +write 选项,请参阅 http://www.imagemagick.org/script/command-line-options.php#write),但它不起作用,因为 +write 命令似乎无法恢复图像回到原来的状态:

convert '/tmp/original.jpg'[0] -quality 95 -density 72x72 -resample 72x72 +profile '!xmp,*'\
-resize '900>' +write '/tmp/900.jpg'\
-resize '700>' +write '/tmp/700.jpg'\
-resize '200x' -crop '200x200+0+35' +repage +write '/tmp/200.jpg' \
-resize 'x550>' +write '/tmp/550.jpg'\
-resize 'x400>' +write '/tmp/400.jpg'\
-resize 'x150>' '/tmp/150.jpg'\

* readability purposes 的行尾反斜杠

或者,我尝试了以下方法(使用+clone-delete)。它似乎可以工作,但可能会变得更高效(可能使用mpr:http://www.imagemagick.org/Usage/files/#mpr):

convert 'original.jpg'[0] -quality 95 -density 72x72 -resample 72x72 +profile '!xmp,*' \
    \(+clone -resize 'x150>' -write '150.jpg' \) \ 
-delete 1 \(+clone -resize 'x400>' -write '400.jpg' \) \ 
-delete 1 \(+clone -resize 'x550>' -write '550.jpg' \) \ 
-delete 1 \(+clone -resize '200x' -crop '200x200+0+35' +repage -write '200.jpg' \) \ 
-delete 1 \(+clone -resize '700>' -write '700.jpg' \) -delete 1 -resize '900>' '900.jpg' \

谁能解释我在第一个示例中做错了什么(使用+write 命令)?另外,任何人都可以提出任何改进以提高 CPU/内存效率吗?

后回答

我仍然很好奇为什么+write 不起作用。

【问题讨论】:

  • @D Camey:你的 IM 似乎很新。您是否考虑过将您的+write 命令与一两个以前发布的 IM 版本一起使用?您是否考虑向 ImageMagick 开发人员提交有关 +write 的错误报告?
  • 是的,我考虑过。我想我会先在这里检查一下,以防我误解了文档或其他人有同样的问题。

标签: image image-processing imagemagick chaining


【解决方案1】:

事实证明,使用mpr: 是可行的方法(从我在论坛上看到的等等):

convert 'original.jpg'[0] -quality 95 -density 72x72 -resample 72x72 +profile '!xmp,*' \
-write mpr:orig +delete \
mpr:orig -resize 'x150>' -write '150.jpg' +delete \
mpr:orig -resize 'x400>' -write '400.jpg' +delete \
mpr:orig -resize 'x550>' -write '550.jpg' +delete \
mpr:orig -resize '200x' -crop '200x200+0+35' +repage -write '200.jpg' +delete \ 
mpr:orig -resize '700>' -write '700.jpg' +delete \ 
mpr:orig -resize '900>' '900.jpg' +delete 

注意:以防万一您错过了,对于链中的最后一个图像,您不需要 -write 命令。

另请注意:在输出的文件上使用扩展名很重要。如果省略它,convert 不知道在编写它们时应该使用哪种格式(可能是因为将图像存储在mpr: 中会破坏该信息)。

【讨论】:

    【解决方案2】:

    您误解了+write 参数的含义。它不会撤消您在写入操作之前执行的任何图像处理,它只会撤消由写入操作本身引起的任何处理。

    例如假设您有一张 JPG 图片,并且您执行以下操作:

    convert original.jpg -scale 50% -write output1.gif output2.jpg

    会发生什么? convertoriginal.jpg 读取到内存并将其缩小到分辨率的一半。现在它应该将它写入output1.gif,但由于 GIF 格式仅支持基于调色板的图像,它会将图像转换为 256 色并写入 GIF 文件。现在它将把当前图像(减少为 256 色)转换回真彩色(24 位 RGB)并将其写入output2.jpg,因为 JPG 文件不支持基于调色板的图像。尽管如此,如果您将 GIF 文件转换为 JPG,JPG 看起来会非常相似(它将被限制为大约 256 种不同的颜色)。

    现在让我们再次尝试相同的操作,但这次我们执行以下操作:

    convert original.jpg -scale 50% +write output1.gif output2.jpg

    会发生什么? convertoriginal.jpg 读取到内存并将其缩小到分辨率的一半。现在它应该把它写到output1.gif,然而,不修改它,这就是+write的意思,所以它首先将图像克隆到内存中。它将 克隆 转换为 256 色并将结果写入output1.gif。然后它再次丢弃克隆并继续处理它在克隆之前拥有的图像。该图像现在写入output2.jpg,这意味着这一次,output2.jpg 将是original.jpg 的缩小版本,看起来不像是基于 256 调色板的图像。

    在任何情况下都不会撤消缩放操作,因为它与写入操作完全无关。如果要撤消缩放操作,则需要保存图像、缩放图像、写入图像然后恢复图像,或者克隆图像、缩放图像、写入图像然后丢弃克隆图像。无论哪种方式都应该同样快,因为在两种情况下在内存中执行的副本数量是相同的,只是命令行语法不同。

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2016-11-28
      • 2016-06-30
      • 2023-04-02
      • 2014-11-24
      • 2018-10-10
      相关资源
      最近更新 更多