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