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

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

例如,给定这个代码,我假设正在运行的node app /path/to/image.png我会收到一个大小为200×100的图像,但是我得到了一个180×100或200×90的图像。

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

我也尝试了resize选项。 甚至有一个选项可以强制这个尺寸,但是输出的高宽比是可怕的。

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

尝试与imagemagick包: 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的答案,因为它是最新的。

要使用gm模块实现具有中心重力的resize的裁剪图像,可以使用类似下面的内容:

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

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

然后gravity函数告诉GraphicsMagick下面的crop函数应该如何performance,这将裁剪图像的最终大小。

您可以在这里findgm模块使用的GraphicsMagick选项的详细文档: http : //www.graphicsmagick.org/GraphicsMagick.html

没有外部库的另一个解决scheme(imagemagick除外)是创build你自己的解决scheme:

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

它将允许您的质量,作物,水印等自定义参数…

两件事情…

1) https://github.com/rsms/node-imagemagick – 这个软件包不再被支持我会推荐你​​使用的原始软件包。

2)不resize的原因是.resize函数接受一个string,而不是一个整数。 应该是… ('353','257')

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