Skip to content

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);
});

Liens connexes

Distribué sous licence Apache 2.0.