API de Formato de Saída
Sharp suporta vários formatos de saída de imagem, cada um com suas opções e usos específicos.
Formato JPEG
Uso Básico
javascript
import sharp from 'sharp';
sharp('input.png')
.jpeg()
.toFile('output.jpg');Opções JPEG
javascript
sharp('input.png')
.jpeg({
quality: 80, // Qualidade (1-100)
progressive: false, // JPEG progressivo
chromaSubsampling: '4:4:4', // Subamostragem de croma
mozjpeg: false, // Usar codificador mozjpeg
trellisQuantisation: false, // Quantização trellis
overshootDeringing: false, // Redução de ringing por overshoot
optimiseScans: false, // Otimizar varreduras
quantisationTable: 0 // Tabela de quantização
})
.toFile('output.jpg');Configurações de Qualidade
javascript
// Alta qualidade
sharp('input.png').jpeg({ quality: 95 })
// Qualidade média
sharp('input.png').jpeg({ quality: 80 })
// Baixa qualidade (arquivo pequeno)
sharp('input.png').jpeg({ quality: 50 })Formato PNG
Uso Básico
javascript
sharp('input.jpg')
.png()
.toFile('output.png');Opções PNG
javascript
sharp('input.jpg')
.png({
progressive: false, // PNG progressivo
compressionLevel: 6, // Nível de compressão (0-9)
adaptiveFiltering: false, // Filtragem adaptativa
palette: false, // Modo de paleta
quality: 100, // Qualidade (apenas para modo de paleta)
colours: 256, // Número de cores (apenas para modo de paleta)
dither: 0.5, // Dithering (0-1)
force: false // Forçar saída PNG
})
.toFile('output.png');Tratamento de Transparência
javascript
// Preservar transparência
sharp('input.png')
.png()
.toFile('output.png');
// Adicionar fundo branco
sharp('input.png')
.flatten({ background: { r: 255, g: 255, b: 255 } })
.png()
.toFile('output.png');Formato WebP
Uso Básico
javascript
sharp('input.jpg')
.webp()
.toFile('output.webp');Opções WebP
javascript
sharp('input.jpg')
.webp({
quality: 80, // Qualidade (1-100)
alphaQuality: 100, // Qualidade de transparência (1-100)
lossless: false, // Compressão sem perdas
nearLossless: false, // Compressão quase sem perdas
smartSubsample: false, // Subamostragem inteligente
reductionEffort: 4, // Esforço de compressão (0-6)
mixed: false, // Modo misto
force: false // Forçar saída WebP
})
.toFile('output.webp');WebP Sem Perdas
javascript
// Compressão sem perdas
sharp('input.png')
.webp({ lossless: true })
.toFile('output.webp');
// Compressão quase sem perdas
sharp('input.png')
.webp({ nearLossless: true, quality: 60 })
.toFile('output.webp');Formato AVIF
Uso Básico
javascript
sharp('input.jpg')
.avif()
.toFile('output.avif');Opções AVIF
javascript
sharp('input.jpg')
.avif({
quality: 80, // Qualidade (1-100)
lossless: false, // Compressão sem perdas
effort: 4, // Esforço de compressão (0-6)
chromaSubsampling: '4:4:4', // Subamostragem de croma
force: false // Forçar saída AVIF
})
.toFile('output.avif');Formato TIFF
Uso Básico
javascript
sharp('input.jpg')
.tiff()
.toFile('output.tiff');Opções TIFF
javascript
sharp('input.jpg')
.tiff({
quality: 80, // Qualidade (1-100)
compression: 'jpeg', // Método de compressão
pyramid: false, // Modo pirâmide
tile: false, // Modo tile
tileSize: 256, // Tamanho do tile
xres: 1, // Resolução X
yres: 1, // Resolução Y
resolutionUnit: 'inch', // Unidade de resolução
force: false // Forçar saída TIFF
})
.toFile('output.tiff');Opções de Compressão
javascript
// Compressão JPEG
sharp('input.jpg').tiff({ compression: 'jpeg' })
// Compressão LZW
sharp('input.jpg').tiff({ compression: 'lzw' })
// Sem compressão
sharp('input.jpg').tiff({ compression: 'none' })
// Compressão Deflate
sharp('input.jpg').tiff({ compression: 'deflate' })Formato Bruto (raw)
Saída de Dados de Pixel Brutos
javascript
// Saída de dados brutos RGB
const rawData = await sharp('input.jpg')
.raw()
.toBuffer();
// Saída de dados brutos RGBA
const rawData = await sharp('input.jpg')
.ensureAlpha()
.raw()
.toBuffer();Saída de Múltiplos Formatos
Saída Simultânea de Múltiplos Formatos
javascript
const image = sharp('input.jpg').resize(800, 600);
// Saída de múltiplos formatos
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')
]);Imagens Responsivas
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);
}Detecção de Formato
Seleção Automática de Formato por Extensão de Arquivo
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;
}
}Otimização de Performance
Saída em Stream
javascript
const fs = require('fs');
// Processamento em stream
fs.createReadStream('input.jpg')
.pipe(sharp().jpeg({ quality: 80 }))
.pipe(fs.createWriteStream('output.jpg'));Otimização de Memória
javascript
// Usar Buffer em vez de arquivo
const buffer = await sharp('input.jpg')
.jpeg({ quality: 80 })
.toBuffer();
// Saída direta para resposta
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);
});