如何使用ImageMagick'链接图像转换;s转换命令?
我有一个原始图像(比如1600x1200),我想为它创建一系列具有各种分辨率的缩略图:如何使用ImageMagick'链接图像转换;s转换命令?,image,image-processing,imagemagick,chaining,Image,Image Processing,Imagemagick,Chaining,我有一个原始图像(比如1600x1200),我想为它创建一系列具有各种分辨率的缩略图: 900x0(即,表示图像按比例缩放至900 px宽) 700x0 0x550(即,表示图像按比例缩放至550像素高) 0x400 0x150 200x200(即裁剪和居中) 我可以单独使用convert命令处理这些转换。问题是不断地重新初始化convert,是对资源的巨大浪费;最好将事物链接起来,以便convert可以重用其工作 使用ImageMagick 6.7.0-10,我尝试了以下操作(使用+wri
- 900x0(即,表示图像按比例缩放至900 px宽)
- 700x0
- 0x550(即,表示图像按比例缩放至550像素高)
- 0x400
- 0x150
- 200x200(即裁剪和居中)
convert
命令处理这些转换。问题是不断地重新初始化convert
,是对资源的巨大浪费;最好将事物链接起来,以便convert
可以重用其工作
使用ImageMagick 6.7.0-10,我尝试了以下操作(使用+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:
,):
convert'original.jpg'[0]-质量95-密度72x72-重采样72x72+配置文件'!xmp,*'\
\(+clone-resize'x150>'-写入'150.jpg'\)\
-删除1\(+克隆-调整大小'x400>'-写入'400.jpg'\)\
-删除1\(+克隆-调整大小“x550>”-写入“550.jpg”)\
-删除1\(+克隆-调整大小'200x'-裁剪'200x200+0+35'+重新分页-写入'200.jpg'\)\
-删除1\(+克隆-调整大小“700>”-写入“700.jpg”)-删除1-调整大小“900>”900.jpg\
有人能解释我在第一个示例中做错了什么吗(使用+write
命令)?还有,有人能提出一些改进建议来提高CPU/内存的效率吗
事后答复
我仍然很好奇为什么
+write
不起作用。结果表明,使用mpr:
是一种方法(从我在论坛和其他地方看到的):
注意:为了防止遗漏,不需要为链中的最后一个图像使用-write
命令
还要注意:在输出的文件上使用扩展名是很重要的。如果省略它,
convert
在写入它们时不知道应该使用哪种格式(可能是因为将图像存储在mpr:
中会破坏该信息)。您误解了+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文件不支持基于调色板的图像。尽管如此,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色调色板的图像
在任何情况下,缩放操作都不会撤消,因为它与写入操作完全无关。如果要撤消缩放操作,则需要保存图像、缩放图像、写入图像然后还原图像,或者克隆图像、缩放图像、写入图像然后放弃克隆。这两种方法都应该同样快,因为在内存中执行的拷贝数在这两种情况下都是相同的,只是命令行语法不同。@D Camey:您的IM似乎非常最新。您是否考虑过使用一个或两个以前发布的IM版本来尝试< <代码> +编写>代码>命令?你是否考虑过向ImageMagick开发者提交一份关于
+write
的bug报告?是的,我考虑过了。我想我应该先检查一下这里,以防我误解了文档,或者其他人也有同样的问题。
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