我有一个原始图像(例如,1600x1200),我想为其创建一系列具有各种分辨率的缩略图:
分别,我可以使用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
为什么不起作用。
您误解了+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调色板的图像。
在任何情况下都不会撤消缩放操作,因为它与写入操作完全无关。如果要撤消缩放操作,则需要保存图像,缩放,写入,然后还原,或者克隆,缩放,写入,然后丢弃克隆。两种方法都应该同样快,因为在两种情况下,内存中执行的副本数相同,只是命令行语法不同。
结果证明,使用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:
中会破坏该信息)。