nodejs gm使用流两次

时间:2013-06-29 15:38:24

标签: node.js asynchronous graphicsmagick

我需要从另一张图片制作两张已调整大小的图片。

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并没有将源图像从流存储在其内部缓冲区中。这是一个错误还是我应该知道以正确方式使用它的其他内容?

注意:使用异步是因为在实际项目中我需要两个结果来执行其他操作。

1 个答案:

答案 0 :(得分: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');
  });
});