调整大小并裁剪图像并保持宽高比NodeJS&克

时间:2014-02-06 00:20:50

标签: node.js graphicsmagick

我一直在尝试使用NodeJS的gm包创建一些缩略图,但我很幸运。我需要调整大于600x600的图像(可以是任何宽度/高度,从给定的一个开始),但是当我将大小传递给gm时,它会创建一个与我请求的大小不同的图像。

例如,根据此代码,我假设运行node app /path/to/image.png我会收到一张尺寸为200x100的图片,但我得到的图像是180x100或200x90 ......

gm(fileLocation)
    .thumb(200, 100, 'processed.' + process.argv[2].split('.').pop(), function() {
        console.log("Done!");
    });

我也尝试过调整大小选项。甚至可以选择强制大小,但输出的宽高比变得很糟糕......

gm('/path/to/image.jpg')
    .resize(353, 257)
    .write(writeStream, function (err) {
         if (!err) console.log(' hooray! ');
    });

5 个答案:

答案 0 :(得分:109)

要使用gm模块获得具有中心重力的经过调整大小的裁剪图像,您可以使用与此类似的内容:

gm('/path/to/image.jpg')
  .resize('200', '200', '^')
  .gravity('Center')
  .crop('200', '200')
  .write(writeStream, function (err) {
    if (!err) console.log(' hooray! ');
  });

'^'函数上的resize参数将告诉GraphicsMagick将高度和宽度用作最小值而不是默认行为 maximum 。生成的已调整大小的图像的宽度高度将是指定的尺寸,而不符合尺寸的尺寸将大于指定的尺寸。

然后gravity函数告诉GraphicsMagick以下crop函数应该如何表现,这会将图像裁剪为最终大小。

您可以在此处找到gm模块使用的GraphicsMagick选项的详细文档:http://www.graphicsmagick.org/GraphicsMagick.html

答案 1 :(得分:8)

尝试使用imagemagick NodeJS包:https://github.com/yourdeveloper/node-imagemagick

im.crop({
    srcPath: process.argv[2],
    dstPath: 'cropped.' + process.argv[2].split('.').pop(),
    width: 200,
    height: 200,
    quality: 1,
    gravity: 'Center'
}, function(err, stdout, stderr){
    if (err) throw err;
    console.log('resized ' + process.argv[2].split('/').pop() + ' to fit within 200x200px');
});

更新:请注意,node-imagemagick包已在相当长的时间内未更新。请考虑Freyday's answer,因为它是最新的。

答案 2 :(得分:2)

没有外部库的另一种解决方案(imagemagick除外)是创建自己的解决方案:

var exec = require('child_process').exec;

resize = function (image) {
  var cmd = 'convert ' + image.src + 
  ' -resize ' + image.width + 'x' + image.height + '^' + 
  ' -gravity center -crop ' + image.width + 'x' + image.height + '+0+0 ' +
  image.dst;

  exec(cmd, function(error, stdout, stderr) {
    if(error) {
      console.log(error);
    }
  });
}

然后叫它:

resize({
    src: sourceFile,
    dst: destinyFile,
    width: 320,
    height: 240
});

它将允许您自定义质量,裁剪,水印等参数......

答案 3 :(得分:1)

尝试使用Node.js https://www.npmjs.com/package/jimp的Jimp软件包。我认为这比通用汽车更好。它不需要任何依赖关系。我以前尝试使用gm,但无法安装gm的依赖项。最后,我使用了jimp,一切正常。

   Jimp.read('lenna.png', (err, lenna) => {
      if (err) throw err;
      lenna
        .resize(256, 256) // resize
        .write('lena-small-bw.jpg'); // save
    });

答案 4 :(得分:-2)

两件事......

1)https://github.com/rsms/node-imagemagick - 不再支持此套餐我会推荐您使用的原始套餐。

2)它没有调整大小的原因是.resize函数接受一个字符串,而不是一个整数。它应该是...... (' 353',' 257')

gm('/path/to/image.jpg')
    .resize('353', '257')
    .write(writeStream, function (err) {
         if (!err) console.log(' hooray! ');
    });