2013-10-29 7 views
7

Ich benutze gm und versuche Bilder entsprechend ihrer Größe zu verarbeiten. Da "Größe" Getter Callback-Funktion benötigt, kann ich die Größe in folgenden Zeilen nicht verwenden.NodeJS GM Bildgröße synchron bekommen

Was ich tun möchte, ist wie folgt aus: in folgenden Resize-Methode

function processImage(url) { 
    var img = gm(this.getImgStream(url)); 

    var width, height; 
    img.size(function(err, val) { 
     width = val.width; 
     height = val.height; 
    }); 

    // I want to use width here, but it's undefined when this line is executed. 
    if (width > 500) width = 500; 
    return img.resize(width) 
} 

I Breite verwendet werden soll. Gibt es eine Möglichkeit, die Größe synchron zu erhalten oder zu warten, bis ein Rückruf abgeschlossen ist? Ich möchte Ivars nicht so lange wie möglich nutzen.

Antwort

9

Da img.size() asynchron ist, können Sie den Vorgang nicht synchron ausführen (dh, Sie können return nicht für einen Rückgabewert verwenden). Daher müssen Sie img.size() beenden, bevor Sie etwas anderes tun können. Sie können entweder einen Rückruf innerhalb der Operation zuweisen oder geben Rückrufe um:

function processImage(url, callback) { 
    var img = gm(this.getImgStream(url)); 

    var width, height; 
    img.size(function(err, val) { 
    width = val.width; 
    height = val.height; 

    callback(err, width, height); 
    }); 
}; 

processImage(url, function(err, width, height) { 
    if (width > 500) width = 500; 
    img.resize(width); 
}); 
+1

was, wenn Sie Bild und Format erhalten möchten ?. . – Pavel

3

Sie können die „Bild-Größe“ npm Paket verwenden

var sizeOf = require('image-size'); 
var dimensions = sizeOf("/pathofimage/image.jpg"); 
console.log(dimensions.width, dimensions.height);