【发布时间】: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