2015-11-26 11 views
6

Próbuję wykonać jakąś manipulację obrazem poprzez gm w collectionFS, ponieważ muszę przeczytać strumień i zapisać go z powrotem do tego samego pliku, muszę użyć pliku tymczasowego - jak pokazano poniżej.gm: zmiana rozmiaru obrazu, jeśli jest szerszy niż 1000px

Chcę sprawdzić, czy obraz jest szerszy niż 1000 pikseli. W takim przypadku należy zmienić rozmiar na 1000px.

Niestety to nie działa, jak mam błędy TypeError: Object [object Object] has no method 'pipe' i Error: gm().stream() or gm().write() with a non-readable stream.

var fs  = Npm.require('fs'), 
    file  = Images.findOne({ _id: fileId }), 
    read  = file.createReadStream('public'), 
    filename = '/tmp/gm_' + Date.now(), 
    temp  = fs.createWriteStream(filename); 

if (method == 'resize') { 
    // resize to 1000px, if image is bigger 
    gmread = gm(read); 
    gmread.size(function(err, size){ 
     if(size.width > 1000) { 
      gmread.resize('1000').stream(); 
     } 
    }); 
} 

gmread.on('end', Meteor.bindEnvironment(function (error, result) { 
    if (error) console.warn(error); 

    var tmpread = fs.createReadStream(filename); 
     write = file.createWriteStream('public'); 

    tmpread.on('end', Meteor.bindEnvironment(function (error, result) { 
     if (error) console.warn(error); 
    })); 

    tmpread.pipe(write); 
})); 

gmread.pipe(temp); 
+0

Używasz CFS: GraphicsMagick? – Ivan

+0

tak, używam tego. – user3142695

+0

Czy funkcja "gm.isAvailable()" zwraca wartość true? Jeśli nie, to nie ma plików binarnych w systemie, aby gm działał. – Ivan

Odpowiedz

2

myślę poprawny sposób w collectionFS jest coś takiego:

var gmread = gm(readStream, fileObj.name()); 
gmread.size({bufferStream: true}, FS.Utility.safeCallback(function (error, size) { 
    if (error) console.warn(error); 
    else { 
     if(size.width > 1000) gmread.resize('1000').stream().pipe(writeStream); 
    } 
})); 

Mybe chcesz umieścić że do transformWrite -function do sklepu ...

0

można pozwolić GraphicsMagick zrobić test. Spróbuj

gmread.resize('1000x50000>'); 

zamiast

gmread.size(function(err, size){ 
    if(size.width > 1000) { 
     gmread.resize('1000').stream(); 
    } 

Zobacz stronę GraphicsMagick "geometry".

Powiązane problemy