如何使用 node.js 和 gm 检查损坏的 jpg 图像?
How to check for corrupted jpg images using node.js and gm?
我想检查损坏的 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)
});
我在自述文件中注意到了这条注释:
If gm does not supply you with a method you need or does not work as
you'd like, you can simply use gm().in() or gm().out() to set your own
arguments.
我试过这样的事情:
gm()
.command("identify")
.in('image.jpg');
但是我没有得到任何输出,所以我可能做错了。
我也尝试过 node-cmd:
cmd.get(
'gm identify image.jpg',
function(data){
console.log('output: ',data)
}
);
但我只看到输出的第一行。
通过 gm
包从 identify
获取多行输出的 clean/recommended 方法是什么?否则,什么是读取识别命令的完整输出的节点优雅解决方案。
更新
我的猜测是字符串未使用 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);
});
通过 gm
获取 stderr
输出的简洁方法是什么?
关于node或Javascript,我很没有资格多说什么,但下面的想法可能会让你兴奋起来和 运行.
据我了解,您想使用 identify
但无法捕获其 stderr
。不过,我们确实知道如何捕获 convert
的 stderr
。因此,建议以模仿 identify
的功能但使用 convert
.
的调用接口的方式调用 convert
你可以这样做:
gm convert someImage.jpg info:-
如果需要,可选择添加 -verbose
。
在 node
中看起来像这样!
gm(jpgPath)
.command('convert')
.write('out.png', function(err, stdout,stderr){
console.log("stderr",stderr);
});
我想检查损坏的 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)
});
我在自述文件中注意到了这条注释:
If gm does not supply you with a method you need or does not work as you'd like, you can simply use gm().in() or gm().out() to set your own arguments.
我试过这样的事情:
gm()
.command("identify")
.in('image.jpg');
但是我没有得到任何输出,所以我可能做错了。
我也尝试过 node-cmd:
cmd.get(
'gm identify image.jpg',
function(data){
console.log('output: ',data)
}
);
但我只看到输出的第一行。
通过 gm
包从 identify
获取多行输出的 clean/recommended 方法是什么?否则,什么是读取识别命令的完整输出的节点优雅解决方案。
更新
我的猜测是字符串未使用 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);
});
通过 gm
获取 stderr
输出的简洁方法是什么?
关于node或Javascript,我很没有资格多说什么,但下面的想法可能会让你兴奋起来和 运行.
据我了解,您想使用 identify
但无法捕获其 stderr
。不过,我们确实知道如何捕获 convert
的 stderr
。因此,建议以模仿 identify
的功能但使用 convert
.
convert
你可以这样做:
gm convert someImage.jpg info:-
如果需要,可选择添加 -verbose
。
在 node
中看起来像这样!
gm(jpgPath)
.command('convert')
.write('out.png', function(err, stdout,stderr){
console.log("stderr",stderr);
});