0

我需要从另一个制作两个调整大小的图像。

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

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

4

1 回答 1

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');
  });
});
于 2013-07-16T11:39:05.123 回答