2013-10-29 14 views
7

Używam gm i próbuję przetwarzać obrazy zgodnie z jego rozmiarem. Ponieważ "rozmiar" getter potrzebuje funkcji wywołania zwrotnego, nie mogę używać rozmiaru w następujących liniach.NodeJS gm pobieranie rozmiaru obrazu synchronicznie

Co chcę zrobić to tak:

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

chcę użyć szerokość w następujący sposób zmiany rozmiaru. Czy istnieje sposób na synchronizację rozmiaru lub oczekiwanie na zakończenie oddzwonienia? Nie chcę używać ivars tak długo, jak to możliwe.

Odpowiedz

9

Ponieważ jest asynchroniczny, nie można wykonać operacji synchronicznie (co oznacza, że ​​nie można również użyć wartości return dla wartości zwracanej). Dlatego musisz wykonać img.size(), aby zakończyć, zanim będziesz mógł zrobić cokolwiek innego. Można też przypisać zwrotnego w ramach operacji, lub przejść wokół zwrotnych:

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

co, jeśli chcesz uzyskać obraz i format ?. . – Pavel

3

można użyć „image-size” pakiet npm

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