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

时间:2015-05-13 19:52:38

标签: javascript node.js imagemagick spawn external-process

$ 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没有区别。

这里的节点脚本为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可以使用非零代码正常退出。

1 个答案:

答案 0 :(得分:1)

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

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

compare -list metric

我建议您先查看AE指标。这个基本上给出了两个输入图像之间不同的像素数。

要禁止生成“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

$ 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

因此,即使在终端中,如果您的图像确实出现像素差异,也会获得退出代码1。查找值-metric AE返回的优势在于您可以对差异进行量化。

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

更新

compare的手册页有这样说:

  

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