API Formati Output
Sharp supporta vari formati di output per immagini, ciascuno con opzioni e utilizzi specifici.
Formato JPEG
Utilizzo di base
javascript
import sharp from 'sharp';
sharp('input.png')
.jpeg()
.toFile('output.jpg');Opzioni JPEG
javascript
sharp('input.png')
.jpeg({
quality: 80, // Qualità (1-100)
progressive: false, // JPEG progressivo
chromaSubsampling: '4:4:4', // Sottocampionamento cromaticità
mozjpeg: false, // Usare codificatore mozjpeg
trellisQuantisation: false, // Quantizzazione trellis
overshootDeringing: false, // Eliminazione ringing overshoot
optimiseScans: false, // Ottimizzazione scansioni
quantisationTable: 0 // Tabella quantizzazione
})
.toFile('output.jpg');Impostazioni qualità
javascript
// Alta qualità
sharp('input.png').jpeg({ quality: 95 })
// Qualità media
sharp('input.png').jpeg({ quality: 80 })
// Bassa qualità (file piccolo)
sharp('input.png').jpeg({ quality: 50 })Formato PNG
Utilizzo di base
javascript
sharp('input.jpg')
.png()
.toFile('output.png');Opzioni PNG
javascript
sharp('input.jpg')
.png({
progressive: false, // PNG progressivo
compressionLevel: 6, // Livello compressione (0-9)
adaptiveFiltering: false, // Filtraggio adattivo
palette: false, // Modalità palette
quality: 100, // Qualità (solo per modalità palette)
colours: 256, // Numero colori (solo per modalità palette)
dither: 0.5, // Dithering (0-1)
force: false // Forzare output PNG
})
.toFile('output.png');Gestione trasparenza
javascript
// Mantenere trasparenza
sharp('input.png')
.png()
.toFile('output.png');
// Aggiungere sfondo bianco
sharp('input.png')
.flatten({ background: { r: 255, g: 255, b: 255 } })
.png()
.toFile('output.png');Formato WebP
Utilizzo di base
javascript
sharp('input.jpg')
.webp()
.toFile('output.webp');Opzioni WebP
javascript
sharp('input.jpg')
.webp({
quality: 80, // Qualità (1-100)
alphaQuality: 100, // Qualità trasparenza (1-100)
lossless: false, // Compressione senza perdita
nearLossless: false, // Compressione quasi senza perdita
smartSubsample: false, // Sottocampionamento intelligente
reductionEffort: 4, // Sforzo compressione (0-6)
mixed: false, // Modalità mista
force: false // Forzare output WebP
})
.toFile('output.webp');WebP senza perdita
javascript
// Compressione senza perdita
sharp('input.png')
.webp({ lossless: true })
.toFile('output.webp');
// Compressione quasi senza perdita
sharp('input.png')
.webp({ nearLossless: true, quality: 60 })
.toFile('output.webp');Formato AVIF
Utilizzo di base
javascript
sharp('input.jpg')
.avif()
.toFile('output.avif');Opzioni AVIF
javascript
sharp('input.jpg')
.avif({
quality: 80, // Qualità (1-100)
lossless: false, // Compressione senza perdita
effort: 4, // Sforzo compressione (0-6)
chromaSubsampling: '4:4:4', // Sottocampionamento cromaticità
force: false // Forzare output AVIF
})
.toFile('output.avif');Formato TIFF
Utilizzo di base
javascript
sharp('input.jpg')
.tiff()
.toFile('output.tiff');Opzioni TIFF
javascript
sharp('input.jpg')
.tiff({
quality: 80, // Qualità (1-100)
compression: 'jpeg', // Metodo compressione
pyramid: false, // Modalità piramide
tile: false, // Modalità tile
tileSize: 256, // Dimensione tile
xres: 1, // Risoluzione X
yres: 1, // Risoluzione Y
resolutionUnit: 'inch', // Unità risoluzione
force: false // Forzare output TIFF
})
.toFile('output.tiff');Opzioni compressione
javascript
// Compressione JPEG
sharp('input.jpg').tiff({ compression: 'jpeg' })
// Compressione LZW
sharp('input.jpg').tiff({ compression: 'lzw' })
// Nessuna compressione
sharp('input.jpg').tiff({ compression: 'none' })
// Compressione Deflate
sharp('input.jpg').tiff({ compression: 'deflate' })Formato raw (grezzo)
Output dati pixel raw
javascript
// Output dati raw RGB
const rawData = await sharp('input.jpg')
.raw()
.toBuffer();
// Output dati raw RGBA
const rawData = await sharp('input.jpg')
.ensureAlpha()
.raw()
.toBuffer();Output multi-formato
Output simultaneo di più formati
javascript
const image = sharp('input.jpg').resize(800, 600);
// Output più formati
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')
]);Immagini responsive
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);
}Rilevamento formato
Selezione automatica formato in base all'estensione file
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;
}
}Ottimizzazione prestazioni
Output streaming
javascript
const fs = require('fs');
// Elaborazione streaming
fs.createReadStream('input.jpg')
.pipe(sharp().jpeg({ quality: 80 }))
.pipe(fs.createWriteStream('output.jpg'));Ottimizzazione memoria
javascript
// Usare Buffer invece di file
const buffer = await sharp('input.jpg')
.jpeg({ quality: 80 })
.toBuffer();
// Output diretto alla risposta
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);
});