Skip to content

Exemplos Avançados

Aqui estão alguns exemplos de uso avançado do Sharp, incluindo operações complexas de processamento de imagem.

Composição de Imagem

Adicionar Marca d'Água

javascript
import sharp from 'sharp';

// Adicionar marca d'água de texto
await sharp('input.jpg')
  .composite([
    {
      input: Buffer.from(`
        <svg width="200" height="100">
          <text x="10" y="50" font-family="Arial" font-size="24" fill="white">
            Watermark
          </text>
        </svg>
      `),
      top: 10,
      left: 10
    }
  ])
  .jpeg()
  .toFile('output.jpg');

Sobreposição de Imagem

javascript
// Sobrepor múltiplas imagens
await sharp('background.jpg')
  .composite([
    {
      input: 'overlay1.png',
      top: 100,
      left: 100
    },
    {
      input: 'overlay2.png',
      top: 200,
      left: 200
    }
  ])
  .jpeg()
  .toFile('output.jpg');

Operações de Canal

Separar Canais

javascript
// Separar canais RGB
const channels = await sharp('input.jpg').separate();

// Salvar cada canal
await sharp(channels[0]).toFile('red-channel.jpg');
await sharp(channels[1]).toFile('green-channel.jpg');
await sharp(channels[2]).toFile('blue-channel.jpg');

Combinar Canais

javascript
// Combinar a partir de arquivos de canal separados
await sharp('red-channel.jpg')
  .joinChannel(['green-channel.jpg', 'blue-channel.jpg'])
  .toFile('merged.jpg');

Conversão de Espaço de Cores

RGB para CMYK

javascript
await sharp('input.jpg')
  .toColourspace(sharp.colourspace.cmyk)
  .tiff()
  .toFile('output.tiff');

Converter para Espaço de Cores Lab

javascript
await sharp('input.jpg')
  .toColourspace(sharp.colourspace.lab)
  .tiff()
  .toFile('output.tiff');

Filtros Avançados

Nitidez Personalizada

javascript
await sharp('input.jpg')
  .sharpen({
    sigma: 1,
    flat: 1,
    jagged: 2
  })
  .toFile('output.jpg');

Correção Gama

javascript
await sharp('input.jpg')
  .gamma(2.2)
  .toFile('output.jpg');

Separação de Tons

javascript
await sharp('input.jpg')
  .tint({ r: 255, g: 0, b: 0 })
  .toFile('output.jpg');

Processamento de Imagens Multipágina

Processar TIFF Multipágina

javascript
// Processar todas as páginas
await sharp('multi-page.tiff', { pages: -1 })
  .resize(800, 600)
  .tiff()
  .toFile('output.tiff');

// Processar página específica
await sharp('multi-page.tiff', { pages: 0 })
  .resize(800, 600)
  .jpeg()
  .toFile('page0.jpg');

Processar PDF

javascript
// Processar primeira página do PDF
await sharp('document.pdf', { pages: 0 })
  .resize(800, 600)
  .jpeg()
  .toFile('page0.jpg');

Geração de Imagens Responsivas

Gerar Múltiplos Tamanhos

javascript
async function generateResponsiveImages(inputPath) {
  const sizes = [
    { width: 320, height: 240, suffix: 'small' },
    { width: 640, height: 480, suffix: 'medium' },
    { width: 1280, height: 960, suffix: 'large' },
    { width: 1920, height: 1440, suffix: 'xlarge' }
  ];
  
  const promises = sizes.map(async ({ width, height, suffix }) => {
    await sharp(inputPath)
      .resize(width, height, { fit: 'cover' })
      .jpeg({ quality: 80 })
      .toFile(`output-${suffix}.jpg`);
  });
  
  await Promise.all(promises);
}

Gerar Múltiplos Formatos

javascript
async function generateMultipleFormats(inputPath) {
  const formats = [
    { format: 'jpeg', quality: 80, ext: 'jpg' },
    { format: 'webp', quality: 80, ext: 'webp' },
    { format: 'avif', quality: 80, ext: 'avif' }
  ];
  
  const promises = formats.map(async ({ format, quality, ext }) => {
    const image = sharp(inputPath).resize(800, 600);
    
    switch (format) {
      case 'jpeg':
        await image.jpeg({ quality }).toFile(`output.${ext}`);
        break;
      case 'webp':
        await image.webp({ quality }).toFile(`output.${ext}`);
        break;
      case 'avif':
        await image.avif({ quality }).toFile(`output.${ext}`);
        break;
    }
  });
  
  await Promise.all(promises);
}

Análise de Imagem

Obter Informações Estatísticas da Imagem

javascript
async function analyzeImage(filePath) {
  const metadata = await sharp(filePath).metadata();
  const stats = await sharp(filePath).stats();
  
  return {
    metadata,
    stats: {
      isOpaque: stats.isOpaque,
      dominant: stats.dominant,
      channels: stats.channels
    }
  };
}

Detectar Tipo de Imagem

javascript
async function detectImageType(filePath) {
  const metadata = await sharp(filePath).metadata();
  
  return {
    format: metadata.format,
    hasAlpha: metadata.hasAlpha,
    isOpaque: metadata.isOpaque,
    channels: metadata.channels,
    colorSpace: metadata.space
  };
}

Corte Avançado

Corte Inteligente

javascript
async function smartCrop(inputPath, outputPath, width, height) {
  // Obter informações da imagem
  const metadata = await sharp(inputPath).metadata();
  
  // Calcular região de corte
  const aspectRatio = width / height;
  const imageAspectRatio = metadata.width / metadata.height;
  
  let cropWidth, cropHeight, left, top;
  
  if (aspectRatio > imageAspectRatio) {
    // Alvo mais largo, usar altura como referência
    cropHeight = metadata.height;
    cropWidth = cropHeight * aspectRatio;
    top = 0;
    left = (metadata.width - cropWidth) / 2;
  } else {
    // Alvo mais alto, usar largura como referência
    cropWidth = metadata.width;
    cropHeight = cropWidth / aspectRatio;
    left = 0;
    top = (metadata.height - cropHeight) / 2;
  }
  
  await sharp(inputPath)
    .extract({ left: Math.round(left), top: Math.round(top), width: Math.round(cropWidth), height: Math.round(cropHeight) })
    .resize(width, height)
    .toFile(outputPath);
}

Otimização de Imagem

Otimização Automática

javascript
async function autoOptimize(inputPath, outputPath) {
  const metadata = await sharp(inputPath).metadata();
  
  let image = sharp(inputPath);
  
  // Escolher melhor formato de acordo com tipo de imagem
  if (metadata.hasAlpha) {
    // Tem transparência, usar PNG
    image = image.png();
  } else {
    // Sem transparência, usar JPEG
    image = image.jpeg({ quality: 80, progressive: true });
  }
  
  await image.toFile(outputPath);
}

JPEG Progressivo

javascript
await sharp('input.jpg')
  .jpeg({ 
    quality: 80, 
    progressive: true,
    mozjpeg: true 
  })
  .toFile('output.jpg');

Processamento Avançado em Lote

Marca d'Água em Lote

javascript
const fs = require('fs').promises;

async function batchWatermark(inputDir, outputDir, watermarkPath) {
  const files = await fs.readdir(inputDir);
  
  for (const file of files) {
    if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
      try {
        await sharp(path.join(inputDir, file))
          .composite([
            {
              input: watermarkPath,
              top: 10,
              left: 10
            }
          ])
          .jpeg({ quality: 80 })
          .toFile(path.join(outputDir, `watermarked_${file}`));
        
        console.log(`Marca d'água adicionada: ${file}`);
      } catch (error) {
        console.error(`Falha ao processar ${file}:`, error.message);
      }
    }
  }
}

Conversão e Otimização de Formato em Lote

javascript
async function batchOptimize(inputDir, outputDir) {
  const files = await fs.readdir(inputDir);
  
  for (const file of files) {
    if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
      try {
        const metadata = await sharp(path.join(inputDir, file)).metadata();
        const image = sharp(path.join(inputDir, file));
        
        // Escolher melhor formato de acordo com características da imagem
        if (metadata.hasAlpha) {
          await image.png({ compressionLevel: 9 }).toFile(path.join(outputDir, file.replace(/\.[^.]+$/, '.png')));
        } else {
          await image.jpeg({ quality: 80, progressive: true }).toFile(path.join(outputDir, file.replace(/\.[^.]+$/, '.jpg')));
        }
        
        console.log(`Otimização concluída: ${file}`);
      } catch (error) {
        console.error(`Falha ao processar ${file}:`, error.message);
      }
    }
  }
}

Lançado sob a Licença Apache 2.0.