2012-04-27 72 views
3

我正在使用https://github.com/aheckmann/gm调整图像大小。Graphicsmagick节点不写整个jpg

var fs = require('fs'); 
var gm = require('gm'); 

var input = __dirname + '/input.jpg'; 
var output = __dirname + '/output.jpg'; 

gm(input) 
    .resize(350) 
    .stream(function(err, stdout, stderr) { 

    var writeStream = fs.createWriteStream(output, { encoding: 'base64' }); 

    var i = ''; 

    stdout.on('data', function(data){ 

     i += data.toString('base64'); 

    }); 

    stdout.on('end', function(){ 

     writeStream.write(new Buffer(i, 'base64')); 
     writeStream.end(); 

    }); 

    }); 

问题是它没有写出整个图像。

half camel

回答

7

我已经通过使用https://github.com/coolaj86/node-bufferjs concat方法解决了它。

var fs = require('fs'); 
var gm = require('gm'); 

var input = __dirname + '/input.jpg'; 
var output = __dirname + '/output.jpg'; 

require('bufferjs'); 

gm(input) 
    .resize(800) 
    .stream(function(err, stdout, stderr) { 

    ws = fs.createWriteStream(output); 

    i = []; 

    stdout.on('data', function(data){ 

     console.log('data'); 

     i.push(data); 


    }); 

    stdout.on('close', function(){ 

     console.log('close'); 

     var image = Buffer.concat(i); 
     ws.write(image.toString('base64'), 'base64'); 
     ws.end(); 

    }); 

    }); 

显然,当你连接它们时,你需要跟踪缓冲区的长度/索引。你可以通过查看bufferjs的concat方法的源代码来找到更多的信息:https://github.com/coolaj86/node-bufferjs/blob/master/bufferjs/concat.js

+0

谢谢,很好的解决方案! – 2017-03-31 21:59:25

3

你为什么不干脆直接写入到输出流,当你的数据吗?

var fs = require('fs'); 
var gm = require('gm'); 

var input = __dirname + '/input.jpg'; 
var output = __dirname + '/output.jpg'; 

gm(input).resize(350).stream(function(err, stdout, stderr) { 

    var writeStream = fs.createWriteStream(output, { 
    encoding: 'base64' 
    }); 

    stdout.pipe(writeStream); 

}); 
+0

啊,因为我实际上将其存储在一个对象,我然后保存到数据库。 – Pickels 2012-04-28 09:34:44

2

我发现imagemagick非常有用和简单。我也试过graphicsmagick,但没有运气。

您可以使用以下命令安装imagemagick

npm install imagemagick 

以下为imagemagick示例代码和文档在https://github.com/rsms/node-imagemagick

var im = require('imagemagick'); 

im.resize({ 
    srcPath: 'kittens.jpg', 
    dstPath: 'kittens-small.jpg', 
    width: 50, 
    height: 50 
}, function(err, stdout, stderr){ 
    if (err) throw err; 
    console.log('resized kittens.jpg to fit within 256x256px'); 
}); 
3

只要做到这一点:

var gm = require('gm').subClass({imageMagick: true}); 

gm('kittens.jpg') 
.resize(50,50) 
.write("kittens-small.jpg", function (err) { 
    if(err) throw err; 
});