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

Javascript ImageMagick compare:从Node.js生成时退出代码1,但从命令行运行时退出代码0,javascript,node.js,imagemagick,spawn,external-process,Javascript,Node.js,Imagemagick,Spawn,External Process,我正在编写一个Node.js脚本来自动处理一些图像 当我尝试通过子进程.exec或子进程.spawn运行脚本时,它会正确运行并完成,但会以代码1而不是代码0退出,因为代码0会在脚本中引发错误 当我在命令行上运行相同的脚本时,它将退出,代码为0 compare命令确实通过stderr返回内容,默认情况下似乎是这样,但我不需要该输出,如果需要,可以将其抑制。我尝试添加了-quiet,没有任何区别 下面是作为子进程.spawn的节点脚本(我再次尝试使用子进程.exec): 同样,我得到了生成的图像,它

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

当我尝试通过
子进程.exec
子进程.spawn
运行脚本时,它会正确运行并完成,但会以代码1而不是代码0退出,因为代码0会在脚本中引发错误

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

compare
命令确实通过stderr返回内容,默认情况下似乎是这样,但我不需要该输出,如果需要,可以将其抑制。我尝试添加了
-quiet
,没有任何区别

下面是作为
子进程.spawn
的节点脚本(我再次尝试使用
子进程.exec
):

同样,我得到了生成的图像,它看起来是正确的,但是进程以代码1退出(发生错误)

输出如下所示:

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);
        });
来自命令行的结果:

[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' }

编辑:使用非0代码退出是一个问题的原因与
子进程承诺
节点模块有关,假设任何非零退出代码都意味着错误。虽然这有点标准,但它不是正式的标准,Imagemagick可以使用非零代码正常退出。

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

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

$ compare img0.png img1.png -fuzz 20 \
           -highlight-color #ffffff -lowlight-color #000000 img.0-1.png
$ echo $?
> 0
我建议您首先查看
AE
指标。这一个基本上为您提供了两个输入图像之间不同的像素数

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

例子 现在,让我们在图片中介绍
-metric

$ 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...
在这种情况下,最后一个命令输出以下内容:

$ 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
因此,即使在终端中,如果图像显示像素差异,也会得到退出代码1。查找
-metric AE
返回值的优势在于,您可以获得差异的量化

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


更新
compare
的手册页上写着:

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


要真正确保您没有追踪重影,请首先尝试将
img0.png
(不是要
img1.png
,而是)与自身(在终端和node.js中)进行比较。您确定在使用spawn时从命令行运行相同版本的ImageMagick吗?当您使用绝对路径作为文件名时会发生什么?“…compare正在“不正确地”退出…”我(还)不相信这一点@帕特里克·冈德森:另外,你没有指明你的ImageMagick版本。在Node.js中是哪一个?你的候机楼里是哪一个请在你的帖子中添加这些(必要的)信息。毕竟,这是关于调试您的问题的……另请参阅我的答案的更新。感谢那里的信息,我实际上希望在我正在进行的过程中使用增量映像。@PatrickGunderson:那我就不明白了。如果比较返回退出代码
0
,则表示没有像素差异,这意味着您的增量图像都是黑色的。。。你想要一个全黑的图像吗?它以代码1退出,但它给了我正确的输出文件。退出代码1与stdout(命令行程序的输出流)不同。退出代码0以外的任何内容都表示程序退出时出现错误。@PatrickGunderson:我的回答向您表明,命令行中的
compare
也将以代码1退出,但如果您允许它这样做,它也将创建“预期的增量映像”。@PatrickGunderson:噢,你认为我不知道退出代码1和命令行程序输出流的区别?顺便说一句,
-度量AE
结果不在标准输出上报告,而是在标准输出上报告。。。
$ 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...
$ 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