0

別の画像からサイズ変更された 2 つの画像を作成する必要があります。

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 に答える