gpt4 book ai didi

javascript - 使用 graphicsmagick 的 collectionFS 中出现意外的空写入流

转载 作者:搜寻专家 更新时间:2023-11-01 04:30:30 26 4
gpt4 key购买 nike

我正在使用 CollectionFS 来管理图像。此外,我正在使用 graphicsmagick gm() 来处理图像。

现在我想裁剪已保存的图像。因此,在单击事件上调用服务器方法,该方法执行 crop()。但是在这样做之后,我在集合中找到了一个空图像,其中 size=0 在正确的日期更新。

我不明白,我做错了什么。

shared.js

Images = new FS.Collection("images", {
stores: [
new FS.Store.FileSystem("thumbnail", {
transformWrite: function(fileObj, readStream, writeStream) {
gm(readStream, fileObj.name()).autoOrient().resize('96', '96' + '^').gravity('Center').extent('96', '96').stream().pipe(writeStream);
}
}),
new FS.Store.FileSystem("public"),
]
});

server.js

Meteor.methods({
'crop': function (fileId, selection) {
var file = Images.findOne({ _id: fileId }),
read = file.createReadStream('public'),
write = file.createWriteStream('public');

gm(read)
.crop(selection.width, selection.height, selection.left, selection.top)
.stream()
.pipe(write);
}
});

client.js

Template.editor.events({
'click #crop': function () {
var fileId = '123456789',
selection = { height: 100, width: 100, top: 10, left: 10 };

Meteor.call('crop', fileId, selection);
}
});

更新

按照 Christian 的建议,我正在为 writeStream 使用 tmp 文件,因为 writeStream 不能与 readStream 相同——这导致了空结果。

但是在写入 tmp 文件之后,它的内容必须被复制回公共(public)存储。我该怎么做?

Meteor.methods({
'crop': function (fileId, selection) {

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

gm(read)
.crop(selection.width, selection.height, selection.left, selection.top)
.stream()
.pipe(tmp);

// After writing to tmp -> copy back to stream and delete tmp-file
}
});

更新 2我试过这个:

// Add temp store
new FS.Store.FileSystem("temp")

// Method
Meteor.methods({
'crop': function (fileId, selection) {
var file = Images.findOne({ _id: fileId }),
read = file.createReadStream('public'),
temp = file.createWriteStream('temp');

gm(read)
.crop(selection.width, selection.height, selection.left, selection.top)
.stream()
.pipe(tmp)
.on('end', function () {
var tmpread = file.createReadStream('temp'),
write = file.createWriteStream('public');

gm(tmpread).stream().pipe(write);
});

}
});

最佳答案

您不能读取和写入同一个文件。这相当于

cat test | grep 1 > test

在外壳上。你可以试试看,test 之后会是空的。

您需要在 crop 方法中创建一个中间的临时文件。


假设这确实是问题所在,那么这是一种方法(未测试):

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

var gmread = gm(read)
.crop(selection.width, selection.height, selection.left, selection.top)
.stream();

gmread.on('end', function() {
// done streaming through GM, copy the result back:
var tmpread = fs.createReadStream(filename);
var write = file.createWriteStream('public');
tmpread.pipe(write);
});

gmread.pipe(tmp);

关于javascript - 使用 graphicsmagick 的 collectionFS 中出现意外的空写入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33831641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com