Node.js 中的图像处理:缩放和裁剪
在现代 Web 开发中,经常需要在服务器端处理图像:调整大小、裁剪、转换格式。Node.js 提供了几个强大的库来完成这些任务。在本文中,我们将介绍两个最流行的库——Sharp(高性能,基于 libvips)和 Jimp(纯 JavaScript,无需原生依赖)。
1. 安装与准备
首先,创建一个新项目并安装其中一个库:
mkdir image-processor && cd image-processornpm init -ynpm install sharp jimp2. 使用 Sharp 调整大小(resize)
Sharp 是一个基于 C 的快速库,非常适合生产环境。它支持流式处理和自动格式检测。
const sharp = require('sharp');
// 简单调整宽度至 300px(高度保持比例)sharp('input.jpg') .resize(300) .toFile('output-300.jpg') .then(() => console.log('完成!')) .catch(err => console.error(err));
// 强制调整至精确尺寸 200x200(会变形)sharp('input.jpg') .resize(200, 200, { fit: 'fill' }) .toFile('output-fill.jpg');
// 智能调整大小并保持比例(居中裁剪)sharp('input.jpg') .resize(200, 200, { fit: 'cover', position: 'centre' }) .toFile('output-cover.jpg');3. 使用 Sharp 裁剪(crop)
extract 方法可以裁剪出图像的矩形区域。
const sharp = require('sharp');
// 裁剪区域:left=100, top=50, width=400, height=300sharp('input.jpg') .extract({ left: 100, top: 50, width: 400, height: 300 }) .toFile('cropped.jpg') .then(info => console.log('已裁剪:', info));4. 使用 Jimp 处理(纯 JavaScript)
Jimp 比 Sharp 慢,但不需要编译原生模块——非常适合简单任务或没有系统包安装权限的环境。
const Jimp = require('jimp');
// 调整宽度至 300pxJimp.read('input.jpg') .then(image => { return image .resize(300, Jimp.AUTO) // AUTO 保持比例 .writeAsync('output-jimp.jpg'); }) .then(() => console.log('Jimp 缩放完成')) .catch(err => console.error(err));
// 带坐标的裁剪Jimp.read('input.jpg') .then(image => { return image .crop(100, 50, 400, 300) // x, y, width, height .writeAsync('cropped-jimp.jpg'); }) .catch(err => console.error(err));5. 组合示例:一次完成缩放 + 裁剪
通常需要先裁剪再缩小。Sharp 通过内部管道高效地完成此操作:
const sharp = require('sharp');
sharp('input.jpg') .extract({ left: 50, top: 30, width: 800, height: 600 }) .resize(400, 300, { fit: 'cover' }) .toFile('result.jpg') .then(info => console.log('最终尺寸:', info.width, 'x', info.height));6. Sharp 与 Jimp 对比
- 性能:对于大文件,Sharp 快 5-10 倍。
- 安装:Jimp 不需要原生依赖(只需 npm install)。
- 功能:Sharp 支持更多格式(heif, tiff, avif)和高级滤镜。
- 流式处理:Sharp 支持 Node.js 流(pipe),Jimp 仅支持缓冲区。
- 建议:对于高负载服务,选择 Sharp。对于简单脚本或学习项目,选择 Jimp。
7. 使用缓冲区处理(不保存到文件)
图像通常通过 HTTP 传入或存储在内存中。两个库都支持 Buffer 操作:
const sharp = requ