API de format de sortie
Sharp prend en charge de nombreux formats de sortie d'images, chacun avec ses options et usages spécifiques.
Format JPEG
Utilisation de base
javascript
import sharp from 'sharp';
sharp('input.png')
.jpeg()
.toFile('output.jpg');Options JPEG
javascript
sharp('input.png')
.jpeg({
quality: 80, // Qualité (1-100)
progressive: false, // JPEG progressif
chromaSubsampling: '4:4:4', // Sous-échantillonnage de chrominance
mozjpeg: false, // Utiliser l'encodeur mozjpeg
trellisQuantisation: false, // Quantification en treillis
overshootDeringing: false, // Deringing par dépassement
optimiseScans: false, // Optimiser les scans
quantisationTable: 0 // Table de quantification
})
.toFile('output.jpg');Paramètres de qualité
javascript
// Haute qualité
sharp('input.png').jpeg({ quality: 95 })
// Qualité moyenne
sharp('input.png').jpeg({ quality: 80 })
// Basse qualité (petit fichier)
sharp('input.png').jpeg({ quality: 50 })Format PNG
Utilisation de base
javascript
sharp('input.jpg')
.png()
.toFile('output.png');Options PNG
javascript
sharp('input.jpg')
.png({
progressive: false, // PNG progressif
compressionLevel: 6, // Niveau de compression (0-9)
adaptiveFiltering: false, // Filtrage adaptatif
palette: false, // Mode palette
quality: 100, // Qualité (uniquement pour le mode palette)
colours: 256, // Nombre de couleurs (uniquement pour le mode palette)
dither: 0.5, // Dithering (0-1)
force: false // Forcer la sortie PNG
})
.toFile('output.png');Traitement de la transparence
javascript
// Conserver la transparence
sharp('input.png')
.png()
.toFile('output.png');
// Ajouter un fond blanc
sharp('input.png')
.flatten({ background: { r: 255, g: 255, b: 255 } })
.png()
.toFile('output.png');Format WebP
Utilisation de base
javascript
sharp('input.jpg')
.webp()
.toFile('output.webp');Options WebP
javascript
sharp('input.jpg')
.webp({
quality: 80, // Qualité (1-100)
alphaQuality: 100, // Qualité de transparence (1-100)
lossless: false, // Compression sans perte
nearLossless: false, // Compression quasi sans perte
smartSubsample: false, // Sous-échantillonnage intelligent
reductionEffort: 4, // Effort de compression (0-6)
mixed: false, // Mode mixte
force: false // Forcer la sortie WebP
})
.toFile('output.webp');WebP sans perte
javascript
// Compression sans perte
sharp('input.png')
.webp({ lossless: true })
.toFile('output.webp');
// Compression quasi sans perte
sharp('input.png')
.webp({ nearLossless: true, quality: 60 })
.toFile('output.webp');Format AVIF
Utilisation de base
javascript
sharp('input.jpg')
.avif()
.toFile('output.avif');Options AVIF
javascript
sharp('input.jpg')
.avif({
quality: 80, // Qualité (1-100)
lossless: false, // Compression sans perte
effort: 4, // Effort de compression (0-6)
chromaSubsampling: '4:4:4', // Sous-échantillonnage de chrominance
force: false // Forcer la sortie AVIF
})
.toFile('output.avif');Format TIFF
Utilisation de base
javascript
sharp('input.jpg')
.tiff()
.toFile('output.tiff');Options TIFF
javascript
sharp('input.jpg')
.tiff({
quality: 80, // Qualité (1-100)
compression: 'jpeg', // Méthode de compression
pyramid: false, // Mode pyramide
tile: false, // Mode tuile
tileSize: 256, // Taille de tuile
xres: 1, // Résolution X
yres: 1, // Résolution Y
resolutionUnit: 'inch', // Unité de résolution
force: false // Forcer la sortie TIFF
})
.toFile('output.tiff');Options de compression
javascript
// Compression JPEG
sharp('input.jpg').tiff({ compression: 'jpeg' })
// Compression LZW
sharp('input.jpg').tiff({ compression: 'lzw' })
// Sans compression
sharp('input.jpg').tiff({ compression: 'none' })
// Compression Deflate
sharp('input.jpg').tiff({ compression: 'deflate' })Format brut (raw)
Sortie de données de pixels brutes
javascript
// Sortie de données brutes RGB
const rawData = await sharp('input.jpg')
.raw()
.toBuffer();
// Sortie de données brutes RGBA
const rawData = await sharp('input.jpg')
.ensureAlpha()
.raw()
.toBuffer();Sortie multi-formats
Sortie simultanée de plusieurs formats
javascript
const image = sharp('input.jpg').resize(800, 600);
// Sortie de plusieurs formats
await Promise.all([
image.clone().jpeg({ quality: 80 }).toFile('output.jpg'),
image.clone().png().toFile('output.png'),
image.clone().webp({ quality: 80 }).toFile('output.webp'),
image.clone().avif({ quality: 80 }).toFile('output.avif')
]);Images responsives
javascript
async function generateResponsiveImages(inputPath) {
const sizes = [320, 640, 1280, 1920];
const formats = ['jpeg', 'webp', 'avif'];
const promises = [];
for (const size of sizes) {
for (const format of formats) {
const image = sharp(inputPath).resize(size);
switch (format) {
case 'jpeg':
promises.push(
image.clone().jpeg({ quality: 80 })
.toFile(`output-${size}.jpg`)
);
break;
case 'webp':
promises.push(
image.clone().webp({ quality: 80 })
.toFile(`output-${size}.webp`)
);
break;
case 'avif':
promises.push(
image.clone().avif({ quality: 80 })
.toFile(`output-${size}.avif`)
);
break;
}
}
}
await Promise.all(promises);
}Détection de format
Sélection automatique du format selon l'extension de fichier
javascript
function getOutputFormat(filename) {
const ext = filename.split('.').pop().toLowerCase();
switch (ext) {
case 'jpg':
case 'jpeg':
return 'jpeg';
case 'png':
return 'png';
case 'webp':
return 'webp';
case 'avif':
return 'avif';
case 'tiff':
case 'tif':
return 'tiff';
default:
return 'jpeg';
}
}
async function convertImage(inputPath, outputPath) {
const format = getOutputFormat(outputPath);
const image = sharp(inputPath);
switch (format) {
case 'jpeg':
await image.jpeg({ quality: 80 }).toFile(outputPath);
break;
case 'png':
await image.png().toFile(outputPath);
break;
case 'webp':
await image.webp({ quality: 80 }).toFile(outputPath);
break;
case 'avif':
await image.avif({ quality: 80 }).toFile(outputPath);
break;
case 'tiff':
await image.tiff({ compression: 'jpeg' }).toFile(outputPath);
break;
}
}Optimisation des performances
Sortie en flux
javascript
const fs = require('fs');
// Traitement en flux
fs.createReadStream('input.jpg')
.pipe(sharp().jpeg({ quality: 80 }))
.pipe(fs.createWriteStream('output.jpg'));Optimisation de la mémoire
javascript
// Utiliser Buffer au lieu de fichier
const buffer = await sharp('input.jpg')
.jpeg({ quality: 80 })
.toBuffer();
// Sortie directe vers la réponse
app.get('/image', async (req, res) => {
const buffer = await sharp('input.jpg')
.resize(300, 200)
.jpeg({ quality: 80 })
.toBuffer();
res.set('Content-Type', 'image/jpeg');
res.send(buffer);
});