我有一张原始图片(例如,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
不起作用。
答案 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
将会发生什么? convert
将original.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
将会发生什么? convert
将original.jpg
读取到内存并将其缩小到分辨率的一半。现在应该将其写入output1.gif
,然而,而不修改,这就是 +write
所说的内容,因此它首先将图像克隆到记忆。它将克隆转换为256种颜色,并将结果写入output1.gif
。然后再次丢弃克隆并继续使用克隆之前的图像进行处理。此图片现在写入output2.jpg
,这意味着此时output2.jpg
将是original.jpg
的缩小版本,并且看起来不像基于256色调色板的图像。
在任何情况下都不会撤消缩放操作,因为它与写入操作完全无关。如果要撤消缩放操作,则需要保存图像,缩放图像,编写图像然后将其还原,或克隆,缩放,写入然后丢弃克隆。无论哪种方式都应该同样快,因为在两种情况下在内存中执行的副本数量都相同,只是命令行语法不同。