Introduction : Qu'est-ce que Sharp et pourquoi l'utiliser ?
Sharp est une bibliothèque haute performance pour le traitement d'images, écrite en C++ et offrant une API pratique pour Node.js. Elle permet de convertir des images aux formats JPEG, PNG, WebP, AVIF, TIFF et GIF vers d'autres formats, de les redimensionner, recadrer, faire pivoter, ajouter des effets et bien plus encore.
Le principal avantage de Sharp est sa vitesse. La bibliothèque utilise les bibliothèques natives libvips, ce qui la rend plusieurs fois plus rapide que ses concurrentes (comme Jimp ou gm). Elle est idéale pour :
- Serveurs web et API — traitement dynamique des avatars, aperçus, optimisation des images avant téléchargement.
- Traitement par lots — conversion de milliers d'images au format et à la taille souhaités.
- Création de miniatures et galeries — génération rapide de thumbnails.
- Optimisation du poids des images — compression sans perte de qualité (ou avec perte contrôlée).
Sharp fonctionne avec des buffers, des flux (streams) et des fichiers, ce qui le rend flexible pour l'intégration dans toute application Node.js.
Installation
L'installation de Sharp se fait via npm. La bibliothèque nécessite Node.js version 12.13.0 ou supérieure (14+ recommandé).
npm install sharp
Si vous utilisez yarn :
yarn add sharp
Important : Sharp compile les modules natifs lors de l'installation. Si vous rencontrez des erreurs, assurez-vous que build-essential (sur Linux) ou Xcode Command Line Tools (sur macOS) sont installés. Sous Windows, Visual Studio Build Tools suffit généralement.
Après l'installation, importez la bibliothèque dans votre projet :
const sharp = require('sharp');
Démarrage rapide
Écrivons un script simple qui charge une image, la réduit à une largeur de 300 pixels (en conservant les proportions) et l'enregistre au format WebP.
const sharp = require('sharp');
const path = require('path');
async function quickStart() {
try {
await sharp('input.jpg')
.resize(300) // Largeur 300px, hauteur ajustée automatiquement
.webp({ quality: 80 }) // Conversion en WebP avec qualité 80%
.toFile('output.webp');
console.log('Image traitée avec succès !');
} catch (error) {
console.error('Erreur :', error);
}
}
quickStart();
Cet exemple illustre l'enchaînement de méthodes (chaining), qui est le principe de base de Sharp. Chaque méthode retourne une nouvelle instance Sharp, permettant d'appliquer des transformations de manière séquentielle.
Méthodes et fonctions principales
Voici 10 méthodes clés de Sharp avec une description détaillée, leurs paramètres et des exemples de code.
1. resize() — Redimensionnement d'image
Fonction : Modifie la largeur et/ou la hauteur d'une image. Peut recadrer ou adapter l'image dans un cadre défini.
Paramètres :
width(number, optionnel) — nouvelle largeur en pixels.height(number, optionnel) — nouvelle hauteur en pixels.options(object, optionnel) :fit(string) — mode d'adaptation : 'cover' (remplir en recadrant), 'contain' (adapter entièrement), 'fill' (étirer), 'inside' (réduire pour s'adapter), 'outside' (agrandir pour dépasser). Par défaut 'cover'.position(string) — position lors du recadrage : 'center', 'top', 'left', 'right', 'bottom', etc.withoutEnlargement(boolean) — interdire l'agrandissement de l'image.
Exemple :
// Réduire à 200x200, recadrage centré
await sharp('input.jpg')
.resize(200, 200, { fit: 'cover', position: 'center' })