调整和裁剪图像并保持纵横比 NodeJS & gm

29

我一直在尝试使用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个回答

115

使用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使用高度和宽度作为最小值,而不是默认行为即最大值。结果缩放后的图像将具有指定尺寸中更大的那个维度,非符合尺寸的维度将大于指定大小。

然后,gravity函数告诉GraphicsMagick如何处理以下的crop函数,该函数将把图像剪裁到最终大小。

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


7

试用 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的答案,因为它是最新的。


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

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


0

两件事情...

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

0

尝试使用 Node.js 的 Jimp 包 https://www.npmjs.com/package/jimp。我认为它比 gm 更好。它不需要任何依赖项。我之前尝试过使用 gm,但我无法安装 gm 的依赖项。最终我使用了 jimp,一切正常运行。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接