2017-04-11 5 views
1

Ich möchte für beschädigte JPEG-Bilder überprüfen und so weit, gerade in der Kommandozeile kann ich identify image.jpg verwenden, die Ausgänge:Wie überprüft man beschädigte JPG-Bilder mit node.js und gm?

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. 

oder gm identify image.jpg die Ausgänge:

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). 

wäre es schön, wenn ich die gm package verwenden kann, um auch die beschädigten JPEG-Daten zu erhalten. Einfach mit identify() gibt eine Menge Daten, aber nichts über korrupte Daten

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

ich diese Notiz in der Readme bemerkt haben:

Wenn gm Sie benötigen, oder tut es Ihnen nicht mit einem Verfahren liefern nicht arbeiten als Sie möchten, können Sie einfach gm(). in() oder gm(). out(), um Ihre eigenen Argumente.

Ich habe so etwas wie dies versucht:

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

aber ich bekomme keine Ausgabe so bin ich wohl etwas falsch gemacht.

Ich habe auch Knoten-cmd versucht:

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

aber ich nur die erste Zeile der Ausgabe sehen.

Was ist die saubere/empfohlene Möglichkeit, die Multiline-Ausgabe von identify über gm Paket zu bekommen? Ansonsten, was ist eine Knoten elegante Lösung zum Lesen der vollständigen Ausgabe des Befehls identifizieren.

aktualisieren Meine Vermutung ist die Zeichenfolge gm nicht angezeigt wird verwendet, weil es durch stderr kommt, nicht stdout.

Ich habe mit einer gezwickt Version von this snippet getestet:

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

Was ist die saubere Art und Weise die stderr Ausgabe über gm zu bekommen?

+0

Hallo George, Sorry, ich spreche 'node' nicht aber ich denke das ist sehr ähnlich - vielleicht? http://StackOverflow.com/a/43222531/2836621 –

+0

Wenn das Problem ist, dass Sie "identifizieren" anstelle von "konvertieren" verwenden möchten, können Sie "konvertieren" wie "identifizieren" (und damit deren Aufruf verwenden Interface) mit 'gm konvertieren someImage.jpg info: -' optional bei Bedarf' -verbose' hinzufügen. –

+0

@MarkSetchell vielen Dank für die Eingabe. Ich habe Ihren Vorschlag an den Knoten angepasst: '' 'gm (jpgPath) .Kommando ('convert') .write ('out.png', Funktion (Fehler, stdout, stderr) { console.log (" stderr " , stderr); }); '' 'und es funktioniert! Wenn Sie Ihren Kommentar als Antwort hinzufügen, wäre ich mehr als glücklich zu akzeptieren :) –

Antwort

2

Ich bin sehr unqualifiziert, etwas zu sagen viel über Knoten oder Javascript, aber die folgende Idee können Sie zum Laufen bekommen.

Wie ich es verstehe, möchten Sie identify verwenden, aber sind nicht in der Lage, seine stderr zu erfassen. Wir können jedoch die stderr von convert erfassen. Also, der Vorschlag ist, convert in einer Weise aufzurufen, die die Funktionalität von identify aber mit der aufrufenden Schnittstelle von convert nachahmt.

Sie können das tun, wie folgt:

gm convert someImage.jpg info:- 

optional in -verbose Zugabe, wenn nötig.

Das sieht in node anscheinend so aus!

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