gm:如果图像大于1000px,则调整图像大小

时间:2015-11-26 11:17:05

标签: javascript meteor graphicsmagick collectionfs

我试图通过gm中的collectionFS进行一些图像处理,因为我需要读取一个流并将其写回同一个文件,我必须使用临时文件 - 如如下所示。

我想检查图像是否宽于1000px。在这种情况下,它应该重新调整为1000px。

不幸的是,这不起作用,因为我收到了错误TypeError: Object [object Object] has no method 'pipe'Error: gm().stream() or gm().write() with a non-readable stream.

var fs       = Npm.require('fs'),
    file     = Images.findOne({ _id: fileId }),
    read     = file.createReadStream('public'),
    filename = '/tmp/gm_' + Date.now(),
    temp     = fs.createWriteStream(filename);

if (method == 'resize') {
    // resize to 1000px, if image is bigger
    gmread = gm(read);
    gmread.size(function(err, size){
        if(size.width > 1000) {
            gmread.resize('1000').stream();
        }
    });
}

gmread.on('end', Meteor.bindEnvironment(function (error, result) {
    if (error) console.warn(error);

    var tmpread = fs.createReadStream(filename);
        write   = file.createWriteStream('public');

    tmpread.on('end', Meteor.bindEnvironment(function (error, result) { 
        if (error) console.warn(error);
    }));

    tmpread.pipe(write);
}));

gmread.pipe(temp);

2 个答案:

答案 0 :(得分:2)

我认为collectionFS中的正确方法是这样的:

var gmread = gm(readStream, fileObj.name());
gmread.size({bufferStream: true}, FS.Utility.safeCallback(function (error, size) {
    if (error) console.warn(error);
    else {
        if(size.width > 1000) gmread.resize('1000').stream().pipe(writeStream);
    }
}));

Mybe你想把它放到你的商店的transformWrite - 函数中......

答案 1 :(得分:0)

你可以让GraphicsMagick进行测试。尝试

gmread.resize('1000x50000>');

而不是

gmread.size(function(err, size){
    if(size.width > 1000) {
        gmread.resize('1000').stream();
    }

请参阅GraphicsMagick docs页面。