Node.js 中的图像处理:使用 Sharp 和 Jimp 进行缩放和裁剪

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Node.js 中的图像处理:缩放和裁剪

在现代 Web 开发中,经常需要在服务器端处理图像:调整大小、裁剪、转换格式。Node.js 提供了几个强大的库来完成这些任务。在本文中,我们将介绍两个最流行的库——Sharp(高性能,基于 libvips)和 Jimp(纯 JavaScript,无需原生依赖)。



1. 安装与准备

首先,创建一个新项目并安装其中一个库:

mkdir image-processor && cd image-processornpm init -ynpm install sharp jimp


2. 使用 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                    

推荐