【问题标题】:Graphicsmagick for node not writing the whole jpg节点的Graphicsmagick不写整个jpg
【发布时间】:2012-04-27 23:41:02
【问题描述】:

我正在使用https://github.com/aheckmann/gm 调整图像大小。

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

    });

  } );

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

【问题讨论】:

    标签: node.js graphicsmagick


    【解决方案1】:

    我已经使用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

    【讨论】:

      【解决方案2】:

      为什么不直接在获取数据的时候写入输出流呢?

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

      【讨论】:

      • 啊,因为我实际上将它存储在一个对象中,然后我将其保存到数据库中。
      【解决方案3】:

      只需这样做:

      var gm = require('gm').subClass({imageMagick: true});
      
      gm( 'kittens.jpg' )
      .resize(50,50)
      .write( "kittens-small.jpg", function (err) {
          if( err ) throw err;
      });
      

      【讨论】:

        【解决方案4】:

        我发现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');
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-15
          • 1970-01-01
          • 1970-01-01
          • 2017-08-27
          相关资源
          最近更新 更多