2016-03-23 15 views
3

Ich versuche, einige Zuschneiden zu tun mit graphicsmagick und cfs und das Ergebnis S3 speichern (cfs: gridfs, cfs: graphicsmagick und cfs: s3).graphicsmagick und cfs: Shop ein Bild zu drei Geschäfte abgeschnitten - die Schaffung Temp Strom

Das beschnittene Bild sollte in drei Speichern gespeichert werden (Haupt-, öffentliche und Miniaturansicht) - die Filialen selbst haben einige transformWrite Funktionen. Also dachte ich, ich müsste dafür einen temporären Stream erstellen, aber ich konnte diesen temporären Stream nicht erstellen. Ich brauche etwas Hilfe dafür.

Ich verwende die gridFS, kein Dateisystem

var file  = Media.findOne({ _id: fileId }), 
    read  = file.createReadStream('main'); 

gmread = gm(read) 
    .crop(selection.w, selection.h, selection.x, selection.y) 
    .stream(); 

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

    // create a temp stream 
    var tmpread = fs.createReadStream(filename); // <-- MY PROBLEM 

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

    // set cropped image to main store 
    var write = file.createWriteStream('main'); 
    tmpread.pipe(write); 

    // set public store image 
    var writePublic = file.createWriteStream('public'); 
    gm(tmpread).stream().pipe(writePublic); 

    // set thumbnail image 
    var writeThumbnail = file.createWriteStream('thumbnail'); 
    gm(tmpread).stream().pipe(writeThumbnail); 

})); 

gmread.pipe(temp); 

Antwort

0

Eigentlich brauchen Sie nicht den temp Strom zu erzeugen, dies zu tun, kann man einfach die transformWrite Funktionen nutzen. Auch Sie nicht diese Ereignis-Listener verwenden müssen, hier ist ein funktionierendes Beispiel, dass ich in meinem Projekt verwenden

var profilePictureResize = function(fileObj,readStream,writeStream){ 
    gm(readStream,fileObj.name()).resize('76','76^').gravity('Center').extent('76', '76').stream().pipe(writeStream); 
} 
var previewResize = function(fileObj,readStream,writeStream){ 
    gm(readStream,fileObj.name()).resize('240','160^').gravity('Center').extent('240', '160').stream().pipe(writeStream); 
} 
Images = new FS.Collection("images", { 
    stores: [ 
     new FS.Store.FileSystem("images"), 
     new FS.Store.FileSystem("profileSize",{transformWrite: profilePictureResize}), 
     new FS.Store.FileSystem("previewSize",{transformWrite: previewResize}) 
    ], 
    // permit only images here 
    filter: { 
     allow: { 
      contentTypes: ['image/*'] 
     } 
    } 
}); 
+0

Aber was ich tun muss, etwas wie ein Bildbearbeitungsprogramm zu erstellen: Wenn ich auf eine Schaltfläche klicke, sollte eine Beschneidung gemacht werden (Beispiel), für eine andere Schaltfläche gibt es eine andere Aktion. Und das sollte dann für jeden Laden getan werden. Deshalb mache ich zuerst die Manipulation und schreibe dann Stream in den Laden ... – user3142695

0

Ich bin nicht sicher, ob ich das Problem richtig verstanden, aber man konnte eine PassThrough stream verwenden, die Sie schreiben das Ergebnis einmal.