Node.js 调整图像大小并裁剪图像,保持纵横比;转基因的

Node.js 调整图像大小并裁剪图像,保持纵横比;转基因的,node.js,graphicsmagick,Node.js,Graphicsmagick,我一直在尝试使用NodeJS的gm包创建一些缩略图,但我运气不好。我需要调整大于600x600的图像大小(可以是任何宽度/高度,从给定的开始),但当我将大小传递给gm时,它会创建一个与我要求的大小不同的图像 例如,给定这段代码,我假设运行node app/path/to/image.png我将收到一个大小为200x100的图像,但我得到的图像是180x100或200x90 gm(fileLocation) .thumb(200, 100, 'processed.' + process.a

我一直在尝试使用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! ');
    });

尝试使用适用于NodeJS的
imagemagick
软件包:


更新:请注意,软件包已经很长时间没有更新了。请考虑一下,因为它是最新的。

< P>两件事…< /P> 1) -不再支持此软件包。我建议您使用原始软件包

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


要使用
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下列
裁剪
函数的行为,这将裁剪图像到最终大小


您可以在此处找到
gm
模块使用的GraphicsMagick选项的详细文档:

没有外部库的另一个解决方案(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
});

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

尝试使用Node.js的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
    });
resize({
    src: sourceFile,
    dst: destinyFile,
    width: 320,
    height: 240
});
   Jimp.read('lenna.png', (err, lenna) => {
      if (err) throw err;
      lenna
        .resize(256, 256) // resize
        .write('lena-small-bw.jpg'); // save
    });