如何使用node.js和gm检查损坏的jpg图像?

时间:2017-04-11 12:50:12

标签: javascript node.js imagemagick stdout graphicsmagick

我想检查损坏的jpeg图像,到目前为止,直接在命令行中我可以使用identify image.jpg输出:

image.jpg JPEG 1920x1200 1920x1200+0+0 8-bit sRGB 65.5KB 0.000u 0:00.009
identify: Premature end of JPEG file `image.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.
identify: Corrupt JPEG data: premature end of data segment `image.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.

或  gm identify image.jpg输出:

image.jpg JPEG 1920x1200+0+0 DirectClass 8-bit 64.0Ki 0.000u 0:01
gm identify: Corrupt JPEG data: premature end of data segment (image.jpg).
    gm identify: Corrupt JPEG data: premature end of data segment (image.jpg).

如果我可以使用gm package来获取损坏的JPEG数据,那将会很好。简单地使用identify()输出大量数据,但没有关于损坏数据的信息

gm('image.jpg')
.identify('%C',function (err, data) {
  if (!err) console.log(data)
  else console.error(err)
});

我在自述文件中注意到了这个注释:

  

如果gm没有为您提供您需要或不能使用的方法   你可以,你可以简单地使用gm()。in()或gm()。out()来设置你自己的   参数。

我尝试过这样的事情:

gm()
.command("identify") 
.in('image.jpg');

但我没有输出,所以我可能做错了。

我还试过了node-cmd:

cmd.get(
        'gm identify image.jpg',
        function(data){
            console.log('output: ',data)
        }
    );

但我只看到输出的第一行。

identify通过gm包获取多行输出的干净/推荐方式是什么?否则,什么是读取识别命令的完整输出的节点优雅解决方案。

更新 我的猜测是,字符串未使用gm显示,因为它来自stderr,而不是stdout

我使用this snippet的调整版本进行了测试:

var spawn = require('child_process').spawn;

var bin = "identify"
var args = ['image.jpg'];
var cspr = spawn(bin, args);
cspr.stderr.on('data', function (data) {
    data += '';
    console.log(data.replace("\n", "\nstderr: "));
});
cspr.on('exit', function (code) {
    console.log('child process exited with code ' + code);
    process.exit(code);
});

通过stderr获取gm输出的简洁方法是什么?

1 个答案:

答案 0 :(得分:2)

我对节点 Javascript 的说法非常不合格,但以下想法可能会让您启动并运行。

据我了解,您希望使用identify但无法捕获其stderr。我们知道如何捕获stderr的{​​{1}}。因此,建议是以模仿convert功能的方式调用convert,但调用接口为identify

你可以这样做:

convert

如果需要,可以选择添加gm convert someImage.jpg info:-

-verbose显然看起来像这样!

node