2013-06-29 2 views
0

Мне нужно сделать два изображения с измененным размером от другого.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 используется, потому что в реальном проекте мне нужны оба результата для выполнения других действий с ними.

+0

Так почему вы используете поток тогда? – robertklep

+0

Я уже не использую его, но для этого нужно подумать о копировании данных из потока в буфер, делая код больше. Во всяком случае, если gm-библиотека позволяет писать gm (stream) .resize (...). Stream (callback) .resize (...). Stream (callback), чем он должен работать с потоками и файлами подобным образом без обходных путей. – Lisio

ответ

0

попробовать это, я не думаю, что вам нужно использовать writeStreams в этом случае:

gm(imagePath) 
    .resize(640, 480) 
    .autoOrient() 
    .flip() 
    .write(newImagePath, function(e) { 
    if (e) throw e; 
    gm(newImagePath) 
    .resize(320, 240) 
    .write(newImagePathSmall, function(e) { 
    if (e) throw e; 
    console.log('resized successfuly'); 
    }); 
}); 
Смежные вопросы