Мне нужно сделать два изображения с измененным размером от другого.nodejs gm, используя поток дважды
var fs = require('fs')
, gm = require('gm')
, async = require('async');
var worker = function(filename) {
img = gm(fs.createReadStream(filename));
img.flip();
this.run = function() {
async.series([
function(callback) {
img.resize(640, 480);
img.toBuffer(function(err, buffer) {
if (err) {
callback(err);
return;
}
callback(null, true);
})
},
function(callback) {
img.resize(320, 240);
img.toBuffer(function(err, buffer) {
if (err) {
callback(err);
return;
}
callback(null, true);
})
},
],
function(err, results) {
console.log(err, results);
});
};
}
new worker('test.jpg').run();
Этот код генерирует ошибку:
Error: gm().stream() or gm().write() with a non-readable stream.
Если я заменяю fs.createReadStream с именем файла, чем все работает просто отлично. Похоже, что gm не сохраняет исходное изображение из потока во внутреннем буфере. Это ошибка, или я должен знать что-то еще об использовании ее надлежащим образом?
Примечание: Async используется, потому что в реальном проекте мне нужны оба результата для выполнения других действий с ними.
Так почему вы используете поток тогда? – robertklep
Я уже не использую его, но для этого нужно подумать о копировании данных из потока в буфер, делая код больше. Во всяком случае, если gm-библиотека позволяет писать gm (stream) .resize (...). Stream (callback) .resize (...). Stream (callback), чем он должен работать с потоками и файлами подобным образом без обходных путей. – Lisio