在 Node.js 中处理图像:使用 Sharp 进行 resize 和 crop
在现代 Web 开发中,服务器端图像处理是一项常见任务。Node.js 提供了几个强大的图形处理库。在本文中,我们将详细介绍 Sharp 库——一个用于调整图像大小(resize)和裁剪(crop)的快速高效工具。
为什么选择 Sharp?
Sharp 使用原生 libvips 库,使其成为 Node.js 最高性能的解决方案之一。主要优势:
- 处理速度快(比纯 JavaScript 的同类方案快数倍)
- 内存占用低
- 支持所有流行格式:JPEG、PNG、WebP、AVIF、TIFF
- 简单易懂的 API
- 支持流(streams)操作
安装
在 Node.js 项目中安装 Sharp 只需一条命令:
npm install sharp安装后,库即可使用。请确保系统已安装构建原生模块所需的依赖项(通常会自动完成)。
基本调整大小(resize)
resize() 方法允许更改图像的尺寸。我们来看看主要的使用方式。
示例 1:简单调整大小
const sharp = require('sharp');const path = require('path');
async function resizeImage() { try { await sharp('input.jpg') .resize(300, 200) // 宽度 300px,高度 200px .toFile('output.jpg'); console.log('图像调整成功'); } catch (error) { console.error('错误:', error); }}
resizeImage();在此示例中,图像将被压缩到精确的 300x200 像素尺寸,这可能会扭曲比例。
示例 2:保持比例
async function resizeWithProportions() { await sharp('input.jpg') .resize({ width: 400, // 仅指定宽度 height: undefined, // 高度将自动计算 fit: 'inside' // 保持比例 }) .toFile('output_inside.jpg'); console.log('比例已保留');}fit 参数接受多个值:
cover— 裁剪图像以完全填充指定尺寸(默认)contain— 将图像嵌入指定尺寸内,保持比例fill— 拉伸图像至指定尺寸inside— 缩小图像以使其适合指定尺寸outside— 放大图像以使其超出指定尺寸
图像裁剪(crop)
Sharp 提供两种主要的裁剪方式:使用 extract() 方法和通过 resize() 参数。
extract() 方法
允许根据指定坐标从图像中裁剪出矩形区域:
async function cropImage() { await sharp('input.jpg') .extract({ left: 100, // 左侧偏移 top: 50, // 顶部偏移 width: 300, // 区域宽度 height: 200 // 区域高度 }) .toFile('cropped.jpg'); console.log('裁剪完成');}在 resize 时自动裁剪
通常需要同时调整大小和裁剪图像。这可以通过 gravity 或 position 参数实现:
async function cropAndResize() { await sharp('input.jpg') .resize(200, 200, { fit: 'cover', // 裁剪至精确