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

时间:2011-07-05 15:10:23

标签: image image-processing imagemagick chaining

我有一张原始图片(例如,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'

或者,我尝试了以下操作(使用+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不起作用。

2 个答案:

答案 0 :(得分: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:中会破坏该信息)。

答案 1 :(得分:3)

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

E.g。假设您有一个JPG图像并执行以下操作:

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

将会发生什么? convertoriginal.jpg读取到内存并将其缩小到分辨率的一半。现在应该将其写入output1.gif,但由于GIF格式仅支持基于调色板的图像,因此它会将图像转换为256色并写入GIF文件。现在它将当前图像缩小为256色,将其转换回真彩色(24位RGB)并将其写入output2.jpg,因为JPG文件不支持基于调色板的图像。尽管如此,JPG看起来非常像是将GIF文件转换为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色调色板的图像。

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