如何使用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
。 我们知道如何捕捉convert
的stderr
。 所以,build议是以一种模仿identify
function的方式调用convert
,但是使用convert
的调用接口。
你可以这样做:
gm convert someImage.jpg info:-
如果需要,可以selectjoin。
显然这在node
看起来就像这样!
gm(jpgPath) .command('convert') .write('out.png', function(err, stdout,stderr){ console.log("stderr",stderr); });