2013-10-29 11 views
7

Sto utilizzando gm e sto cercando di elaborare le immagini in base alla sua dimensione. Poiché getter "size" richiede la funzione di callback, non posso usare la dimensione nelle righe seguenti.NodeJS gm ricezione delle dimensioni dell'immagine in modo sincrono

Quello che voglio fare è così:

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

voglio usare larghezza in seguito metodo di ridimensionamento. C'è un modo per ottenere le dimensioni in modo sincrono o attendere il completamento di una callback? Non voglio usare ivars il più a lungo possibile.

risposta

9

Poiché img.size() è asincrono, non è possibile eseguire l'operazione in modo sincrono (il che significa che non è possibile utilizzare return per un valore restituito). Pertanto, è necessario terminare img.size() prima di poter fare qualsiasi altra cosa. O si può assegnare una richiamata entro l'operazione, o passare le richiamate in tutto:

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

cosa succede se si vuole ottenere l'immagine e il formato ?. . – Pavel

3

È possibile utilizzare l ' "immagine-size" pacchetto NPM

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