2015-11-26 7 views
6

Sto cercando di manipolare le immagini tramite gm in collectionFS, perché ho bisogno di leggere uno stream e di scriverlo nello stesso file, devo usare un file temporaneo - come mostrato di seguito.gm: ridimensiona l'immagine se è più larga di 1000px

Voglio controllare se l'immagine è più larga di 1000 pixel. In questo caso dovrebbe essere ridimensionato a 1000 px.

Purtroppo questo non funziona, come ho avuto gli errori TypeError: Object [object Object] has no method 'pipe' e 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

Stai usando CFS: GraphicsMagick? – Ivan

+0

sì, lo uso. – user3142695

+0

'gm.isAvailable()' restituisce true? In caso contrario, non ci sono binari sul sistema affinché gm funzioni effettivamente. – Ivan

risposta

2

Penso che il modo corretto in collectionFS è qualcosa di simile:

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 volete mettere che in un transformWrite -funzione per il tuo negozio ...

0

si può lasciare GraphicsMagick fare la prova. Prova

gmread.resize('1000x50000>'); 

invece di

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

vedere la pagina GraphicsMagick "geometry".

Problemi correlati