如果图像的宽度超过1000像素,请使用gm调整大小

6
我正在尝试通过gm来进行一些图像处理工作,因为我需要读取一个流并将其写回到同一个文件中,所以我必须使用一个临时文件 - 如下所示。
我想检查图像是否宽度超过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);

你正在使用cfs:graphicsmagick吗? - Ivan
gm.isAvailable() 返回 true 吗?如果不是,则系统上没有二进制文件可以让 gm 正常工作。 - Ivan
是的,gm运行良好,我可以进行简单的裁剪或类似的操作。但是我对gm不是很熟悉,所以我不知道如何进行调整大小,因为它会导致嵌套函数...如果我只做resize('1000')就可以了。 - user3142695
2个回答

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);
    }
}));

也许你想将其放入一个 transformWrite 函数中来处理你的存储...

0

你可以让GraphicsMagick来进行测试。尝试一下吧。

gmread.resize('1000x50000>');

替代

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

请查看GraphicsMagick "geometry"页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接