if (err) {
return reject(err);
}
const origWidth = size.width;
const origHeight = size.height;
let resizeResult;
// 缩放的宽度和高度做最大最小值限制
if (resizeWidth) {
if (resizeWidth > origWidth * 1.5) {
resizeWidth = Math.floor(origWidth * 1.5);
}
else if (resizeWidth < minSize) {
resizeWidth = minSize;
}
}
if (resizeHeight) {
if (resizeHeight > origHeight * 1.5) {
resizeHeight = Math.floor(origHeight * 1.5);
}
else if (resizeHeight < minSize) {
resizeHeight = minSize;
}
}
resizeResult = this.resize(resizeWidth, resizeHeight);
resizeResult
.quality(quality)
.interlace('line') // 使用逐行扫描方式
.unsharp(2, 0.5, 0.5, 0)
.stream()
.on('end', resolve)
.pipe(writeStream);
});
});
};
说说几个重要的 API:
quality 设置图片的质量,GM 图片质量范围是 0-100,默认的质量是 75。
interlace 用于设置图片在显示器上加载时的显示方式,当然显示方式本身还要受图片本身的影响。
unsharp 用来设置图片的锐度,将一张大图缩放成一张小图时,会损失很多像素,需要适当的增加图片锐度来保证图片的质量。关于 unsharp 的使用,详见 Using ImageMagick to make sharp web-sized photographs 。
等比例裁切严格来说实际上还只是对图片进行缩放,并未动用图片裁切的 API。
还有一种比较常见的裁切方式,会先将图片等比例缩放后再从中心裁切,裁切出来的图片是一个正方形,这样能尽可能保证图片的内容。
/*
* 等比例缩放后从中心裁切 equal scaling crop center(正方形裁切)
* @param { String } 原文件路径
* @param { String } 新文件路径
* @param { String } 缩放规则
* @return { promise }
*/
var escc = function(src, dest, rules) {
return new Promise(function(resolve, reject) {
// 600_90 => 宽度600/高度600/品质90
rules = rules.split('_');
if (rules.length !== 2) {
return reject(new Error('Resize rules invalid'));
}
let cropSize = parseInt(rules[0]);
let quality = parseInt(rules[1]) || defaultQuality;
const readStream = fs.createReadStream(src);
const writeStream = fs.createWriteStream(dest);
if (!cropSize) {
reject(new Error('Crop params invalid'));
return;
}
gm(readStream)
.size({
bufferStream: true
}, function(err, size) {
if (err) {









