如何使用ImageMagick的convert命令链接图像转换?

问题描述 投票:5回答:2

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

  • 900x0(即表示图像按比例缩放到900 px宽)
  • 700x0
  • 0x550(即表示图像按比例缩放到550 px高)
  • 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'

或者,我尝试了以下操作(使用+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 /内存的使用效率吗?

编辑

这是使用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'

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

image image-processing imagemagick chaining
2个回答
4
投票

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

例如假设您有JPG图片,然后执行以下操作:

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

会发生什么? convert读取original.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

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

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


4
投票

结果证明,使用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'

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

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

© www.soinside.com 2019 - 2024. All rights reserved.