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