Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ImageMagick'链接图像转换;s转换命令?_Image_Image Processing_Imagemagick_Chaining - Fatal编程技术网

如何使用ImageMagick'链接图像转换;s转换命令?

如何使用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

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

  • 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