API de traitement d'image
Sharp fournit des fonctionnalités riches de traitement d'image, incluant le redimensionnement, le recadrage, la rotation, les filtres et d'autres opérations.
Redimensionnement (resize)
Utilisation de base
javascript
import sharp from 'sharp';
// Redimensionner aux dimensions spécifiées
sharp('input.jpg')
.resize(300, 200)
.toFile('output.jpg');
// Spécifier uniquement la largeur, la hauteur est calculée automatiquement
sharp('input.jpg')
.resize(300)
.toFile('output.jpg');
// Spécifier uniquement la hauteur, la largeur est calculée automatiquement
sharp('input.jpg')
.resize(null, 200)
.toFile('output.jpg');Options de redimensionnement
javascript
sharp('input.jpg')
.resize(300, 200, {
// Algorithme de redimensionnement
kernel: sharp.kernel.lanczos3,
// Position
position: 'center',
// Couleur de fond
background: { r: 255, g: 255, b: 255, alpha: 1 },
// Conserver le ratio d'aspect
fit: 'cover',
// Ne pas agrandir
withoutEnlargement: true,
// Ne pas réduire
withoutReduction: false
})
.toFile('output.jpg');Algorithmes de redimensionnement
javascript
// Algorithmes de redimensionnement disponibles
sharp.kernel.nearest // Plus proche voisin
sharp.kernel.cubic // Interpolation cubique
sharp.kernel.mitchell // Mitchell-Netravali
sharp.kernel.lanczos2 // Lanczos 2-lobed
sharp.kernel.lanczos3 // Lanczos 3-lobed (par défaut)Modes d'adaptation
javascript
// cover: Conserver le ratio d'aspect, recadrer les parties dépassantes
sharp('input.jpg').resize(300, 200, { fit: 'cover' })
// contain: Conserver le ratio d'aspect, ajouter un fond
sharp('input.jpg').resize(300, 200, { fit: 'contain' })
// fill: Étirer aux dimensions spécifiées
sharp('input.jpg').resize(300, 200, { fit: 'fill' })
// inside: Conserver le ratio d'aspect, ne pas dépasser les dimensions originales
sharp('input.jpg').resize(300, 200, { fit: 'inside' })
// outside: Conserver le ratio d'aspect, atteindre au moins les dimensions spécifiées
sharp('input.jpg').resize(300, 200, { fit: 'outside' })Recadrage (extract)
javascript
// Recadrer une zone spécifiée
sharp('input.jpg')
.extract({ left: 100, top: 100, width: 300, height: 200 })
.toFile('output.jpg');
// Recadrer et redimensionner
sharp('input.jpg')
.extract({ left: 100, top: 100, width: 300, height: 200 })
.resize(150, 100)
.toFile('output.jpg');Rotation (rotate)
javascript
// Rotation de 90 degrés
sharp('input.jpg')
.rotate(90)
.toFile('output.jpg');
// Rotation avec couleur de fond spécifiée
sharp('input.jpg')
.rotate(45, { background: { r: 255, g: 255, b: 255, alpha: 1 } })
.toFile('output.jpg');Retournement (flip/flop)
javascript
// Retournement vertical
sharp('input.jpg')
.flip()
.toFile('output.jpg');
// Retournement horizontal
sharp('input.jpg')
.flop()
.toFile('output.jpg');Flou (blur)
javascript
// Flou gaussien
sharp('input.jpg')
.blur(5)
.toFile('output.jpg');
// Netteté
sharp('input.jpg')
.sharpen()
.toFile('output.jpg');
// Paramètres de netteté personnalisés
sharp('input.jpg')
.sharpen({
sigma: 1,
flat: 1,
jagged: 2
})
.toFile('output.jpg');Filtres
Niveaux de gris
javascript
sharp('input.jpg')
.grayscale()
.toFile('output.jpg');Inversion
javascript
sharp('input.jpg')
.negate()
.toFile('output.jpg');Correction gamma
javascript
sharp('input.jpg')
.gamma(2.2)
.toFile('output.jpg');Luminosité/Contraste
javascript
sharp('input.jpg')
.modulate({
brightness: 1.2, // Luminosité (0.1-2.0)
saturation: 0.8, // Saturation (0-2.0)
hue: 180 // Teinte (0-360)
})
.toFile('output.jpg');Opérations de couleur
Teinte
javascript
sharp('input.jpg')
.tint({ r: 255, g: 0, b: 0 })
.toFile('output.jpg');Matrice de couleur
javascript
sharp('input.jpg')
.recomb([
[0.3588, 0.7044, 0.1368],
[0.2990, 0.5870, 0.1140],
[0.0000, 0.0000, 1.0000]
])
.toFile('output.jpg');Opérations de canaux
Séparation de canaux
javascript
// Obtenir le canal rouge
sharp('input.jpg')
.extractChannel('red')
.toFile('red-channel.jpg');
// Obtenir tous les canaux
const channels = await sharp('input.jpg').separate();Fusion de canaux
javascript
// Fusionner depuis des fichiers de canaux séparés
sharp('red.jpg')
.joinChannel(['green.jpg', 'blue.jpg'])
.toFile('merged.jpg');Opérations combinées
javascript
// Opérations en chaîne
sharp('input.jpg')
.resize(800, 600)
.rotate(90)
.blur(2)
.sharpen()
.jpeg({ quality: 80 })
.toFile('output.jpg');Optimisation des performances
Traitement en flux
javascript
const fs = require('fs');
fs.createReadStream('input.jpg')
.pipe(sharp().resize(300, 200))
.pipe(fs.createWriteStream('output.jpg'));Traitement par lot
javascript
const sharp = require('sharp');
const fs = require('fs').promises;
async function processImages() {
const files = await fs.readdir('./images');
const promises = files
.filter(file => file.endsWith('.jpg'))
.map(async file => {
await sharp(`./images/${file}`)
.resize(300, 200)
.jpeg({ quality: 80 })
.toFile(`./output/${file}`);
});
await Promise.all(promises);
}Gestion des erreurs
javascript
try {
await sharp('input.jpg')
.resize(300, 200)
.toFile('output.jpg');
} catch (error) {
console.error('Échec du traitement d'image:', error.message);
}