2012-04-27 27 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; 
});