Node.js 中的图像处理:使用 Sharp 进行 resize 和 crop

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

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

开始课程

在 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', // 裁剪至精确                    

推荐