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

我想检查损坏的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包来获取损坏的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) } ); 

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

通过gm包得到多线输出的干净/推荐的方法是什么? 否则,读取identify命令的完整输出是节点优雅的解决scheme。

更新我的猜测是string不是用gm显示的,因为它是通过stderr而不是stdout

我已经使用这个片段的调整版本进行了testing:

 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); }); 

通过gm获得stderr输出的干净方式是什么?

我完全没有资格对节点Javascript进行任何说明,但是下面的想法可能会让你运行起来。

据我了解,你想使用identify但无法捕捉它的stderr 。 我们知道如何捕捉convertstderr 。 所以,build议是以一种模仿identifyfunction的方式调用convert ,但是使用convert的调用接口。

你可以这样做:

 gm convert someImage.jpg info:- 

如果需要,可以selectjoin。

显然这在node看起来就像这样!

 gm(jpgPath) .command('convert') .write('out.png', function(err, stdout,stderr){ console.log("stderr",stderr); });