ImageMagick比较:从Node.js生成时退出代码1,但从命令行运行时退出代码0

$ compare --version Version: ImageMagick 6.9.1-1 Q16 x86_64 2015-04-15 http://www.imagemagick.org Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC License: http://www.imagemagick.org/script/license.php Features: DPC Modules Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png xml zlib $ node --version v0.10.33 

我正在写一个Node.js脚本来为我自动处理一些图像。

当我尝试通过child-process.execchild-process.spawn运行脚本时,它运行并正确完成,但是以代码1退出,而不是在脚本中引发错误的代码0。

当我在命令行上运行相同的脚本时,它将以代码0退出。

compare命令确实通过stderr返回的东西,这似乎是默认情况下,但我不需要该输出,如果需要的话,可以被压制。 我已经尝试添加 – -quiet没有区别。

这里的Node脚本为child-process.spawn (我也试过使用child-process.exec ):

 var spawn = require("child-process-promise").spawn, filenameA = "img0.png", filenameB = "img1.png", filenameO = "img.0-1.png"; var p = spawn('compare', [filenameA, filenameB, '-fuzz', 20, '-highlight-color', "#ffffff", '-lowlight-color', "#000000", filenameO]) .progress(function (childProcess) { console.log('[spawn] childProcess.pid: ', childProcess.pid); childProcess.stdout.on('data', function (data) { console.log('[spawn] stdout: ', data.toString()); }); childProcess.stderr.on('data', function (data) { console.log('[spawn] stderr: ', data.toString()); }); }) .then(function(){ console.log("completed", filenameO); }) .fail(function (err) { console.error('[spawn] ERROR: ', err); }); 

再次,我得到生成的图像,看起来是正确的,但进程退出代码1(发生错误)。

输出如下所示:

 [spawn] childProcess.pid: 55002 [spawn] ERROR: { code: 1, message: '`compare img0.png img1.png -fuzz 20 -highlight-color #ffffff -lowlight-color #000000 img.0-1.png` failed with code 1' } 

来自命令行的结果:

 $ compare img0.png img1.png -fuzz 20 \ -highlight-color #ffffff -lowlight-color #000000 img.0-1.png $ echo $? > 0 

编辑:使用非0代码退出的原因是与child-process-promise节点模块有关的问题,假定任何非零退出代码意味着错误。 虽然这是有点标准,这是不正式的标准,Imagemagick可以正常退出非零代码。

我不太了解在Node.js中运行的东西,但这里有一种方法可以帮助您find解决方法:

您可以运行compare而不实际生成“增量”图像,而是返回支持的metric结果之一。 metric是一个简单的数字,表示两个图像之间的差异。 要查看可用指标的列表,请参阅

 compare -list metric 

我build议你先看看AE度量。 这实际上给你两个input图像之间不同的像素的数量。

要抑制“delta”图像的生成,只需使用特殊名称null:作为输出文件名。

 $ convert wizard: wizard.jpg # Generate first image $ convert wizard: wizard.png # Generate a similar, but different image $ compare wizard.{jpg,png} delta.pdf # "Classical" run of `compare` $ compare wizard.{jpg,png} null: # No output image, no `metric` either... 

现在我们来介绍一下-metric图片中的-metric

 $ compare -metric AE wizard.{j,p}* delta.pdf # "delta" image AND metric output $ compare -metric AE wizard.{j,p}* null: # no image, only metric output 

在这种情况下,最后一个命令输出:

 $ compare -metric AE wizard.{j,p}* null: 122473 $ echo $? 1 $ compare -fuzz 20% -metric AE w.{j,p}* null: 0 $ echo $? 0 

因此,即使在terminal中,如果您的图像显示像素差异,您将获得退出代码1。 寻找价值量化的-metric AE回报的好处是你可以量化差异。

如果像素差异过大,则您的代码仍然可以在这些需要生成增量图像的情况下进行分支。


更新

compare手册页有这样的说:

比较程序在错误时返回2,否则返回0,如果图像相似,则返回1;如果不相同,则返回1。

Interesting Posts