Вопрос по node.js, graphicsmagick – Graphicsmagick для узла не пишет весь JPG

3

я используюhttps://github.com/aheckmann/gm изменить размер изображения.

<code>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();

    });

  } );
</code>

Проблема состоит в том, что он не пишет все изображение.

half camel

Ваш Ответ

4   ответа
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;
});
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);

});
Ах, потому что я на самом деле храню его в объекте, который затем сохраняю в базе данных. Pickels
7

Я решил это с помощьюhttps://github.com/coolaj86/node-bufferjs Конкат метод.

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 & apos; метод concat:https://github.com/coolaj86/node-bufferjs/blob/master/bufferjs/concat.js

Спасибо, хорошее решение!

Похожие вопросы