我正在尝试使用 graphicsmagick
和 cfs
进行裁剪并将结果保存到 S3(cfs:gridfs、cfs:graphicsmagick 和 cfs:s3)。
裁剪后的图像应存储到三个存储区(主存储区、公共(public)存储区和缩略图存储区)- 存储区本身具有一些transformWrite
函数。所以我想我必须为此创建一个临时流,但我没有创建这个临时流。我需要一些帮助。
我正在使用 gridFS,没有文件系统
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);
最佳答案
实际上您不需要创建临时流来执行此操作,您只需使用 transformWrite 函数即可。 你也不需要使用那些事件监听器,这里是我在我的项目中使用的一个工作示例
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/*']
}
}
});
关于javascript - graphicsmagick 和 cfs : Store one cropped image to three stores - creating temp stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36180057/