【发布时间】:2017-04-11 12:50:12
【问题描述】:
我想检查损坏的 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)
}
);
但我只看到输出的第一行。
通过gm 包从identify 获取多行输出的干净/推荐方式是什么?否则,读取识别命令的完整输出的节点优雅解决方案是什么。
更新
我的猜测是字符串没有使用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,但我认为这非常相似 - 也许? stackoverflow.com/a/43222531/2836621 -
如果问题是你想使用
identify而不是convert,你可以使用@987654345使convert表现得像identify(从而使用后者的调用接口) @ 如果需要,可以添加-verbose。 -
@MarkSetchell 非常感谢您的意见。我已将您的建议调整为 node:
gm(jpgPath) .command('convert') .write('out.png', function(err, stdout,stderr){ console.log("stderr",stderr); });并且有效!如果您将评论添加为答案,我将非常乐意接受:) -
@MarkSetchell 谢谢。 (顺便说一句,我也不会说
node,我是靠耳朵玩的:P)
标签: javascript node.js imagemagick stdout graphicsmagick