【问题标题】:nodejs gm using stream twicenodejs gm两次使用流
【发布时间】:2013-06-29 15:38:24
【问题描述】:

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

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

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

【问题讨论】:

  • 那你为什么要使用流呢?
  • 我还没有使用它,但它需要考虑将数据从流复制到缓冲区,使代码更大。无论如何,如果 gm 库允许编写 gm(stream).resize(...).stream(callback).resize(...).stream(callback) ,那么它应该以类似的方式处理流和文件而无需变通方法。

标签: node.js asynchronous graphicsmagick


【解决方案1】:

试试这个,我认为在这种情况下你不需要使用 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');
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2016-06-03
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多