2013-06-29 69 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不會將來自流的源圖像存儲在它的內部緩衝區中。這是一個錯誤還是我應該知道一些關於正確使用它的其他信息?

注意:使用異步是因爲在實際項目中,我需要兩個結果來執行其他操作。

+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'); 
    }); 
});