ImageMagick 比较:从 Node.js 生成时退出代码 1,但从命令行生成 运行 时退出代码 0
ImageMagick compare: exit code 1 when spawned from Node.js, but exit code 0 when run from the command line
$ 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.exec
或 child-process.spawn
运行 脚本时,它 运行s 并正确完成,但以代码 1 而不是代码 0 退出脚本错误。
当我在命令行上 运行 相同的脚本时,它以代码 0 退出。
compare
命令通过 stderr 做 return 事情,似乎是默认的,但我不需要那个输出,如果需要,可以被抑制。我试过添加 -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 可以使用非零代码正常退出。
我对 Node.js 中的 运行ning 了解不多,但这里有一种方法可以帮助您找到解决方法:
您可以 运行 compare
而不是实际生成 "delta" 图像,而只是 return 受支持的 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
returns 的优点是您可以量化差异。
如果像素差异太大,您的代码仍然可以针对这些您想要生成增量图像的情况进行分支。
更新
compare
的手册页是这样说的:
The compare program returns 2 on error otherwise 0 if the images are similar or 1 if they are dissimilar.
$ 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.exec
或 child-process.spawn
运行 脚本时,它 运行s 并正确完成,但以代码 1 而不是代码 0 退出脚本错误。
当我在命令行上 运行 相同的脚本时,它以代码 0 退出。
compare
命令通过 stderr 做 return 事情,似乎是默认的,但我不需要那个输出,如果需要,可以被抑制。我试过添加 -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 可以使用非零代码正常退出。
我对 Node.js 中的 运行ning 了解不多,但这里有一种方法可以帮助您找到解决方法:
您可以 运行 compare
而不是实际生成 "delta" 图像,而只是 return 受支持的 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
returns 的优点是您可以量化差异。
如果像素差异太大,您的代码仍然可以针对这些您想要生成增量图像的情况进行分支。
更新
compare
的手册页是这样说的:
The compare program returns 2 on error otherwise 0 if the images are similar or 1 if they are dissimilar.