Output Formats API
Sharp supports multiple image output formats, each with its specific options and use cases.
JPEG Format
Basic Usage
javascript
import sharp from 'sharp';
sharp('input.png')
.jpeg()
.toFile('output.jpg');JPEG Options
javascript
sharp('input.png')
.jpeg({
quality: 80, // Quality (1-100)
progressive: false, // Progressive JPEG
chromaSubsampling: '4:4:4', // Chroma subsampling
mozjpeg: false, // Use mozjpeg encoder
trellisQuantisation: false, // Trellis quantization
overshootDeringing: false, // Overshoot deringing
optimiseScans: false, // Optimize scans
quantisationTable: 0 // Quantization table
})
.toFile('output.jpg');Quality Settings
javascript
// High quality
sharp('input.png').jpeg({ quality: 95 })
// Medium quality
sharp('input.png').jpeg({ quality: 80 })
// Low quality (smaller files)
sharp('input.png').jpeg({ quality: 50 })PNG Format
Basic Usage
javascript
sharp('input.jpg')
.png()
.toFile('output.png');PNG Options
javascript
sharp('input.jpg')
.png({
progressive: false, // Progressive PNG
compressionLevel: 6, // Compression level (0-9)
adaptiveFiltering: false, // Adaptive filtering
palette: false, // Palette mode
quality: 100, // Quality (palette mode only)
colours: 256, // Number of colors (palette mode only)
dither: 0.5, // Dithering (0-1)
force: false // Force PNG output
})
.toFile('output.png');Transparency Handling
javascript
// Preserve transparency
sharp('input.png')
.png()
.toFile('output.png');
// Add white background
sharp('input.png')
.flatten({ background: { r: 255, g: 255, b: 255 } })
.png()
.toFile('output.png');WebP Format
Basic Usage
javascript
sharp('input.jpg')
.webp()
.toFile('output.webp');WebP Options
javascript
sharp('input.jpg')
.webp({
quality: 80, // Quality (1-100)
alphaQuality: 100, // Alpha quality (1-100)
lossless: false, // Lossless compression
nearLossless: false, // Near-lossless compression
smartSubsample: false, // Smart subsampling
reductionEffort: 4, // Reduction effort (0-6)
mixed: false, // Mixed mode
force: false // Force WebP output
})
.toFile('output.webp');Lossless WebP
javascript
// Lossless compression
sharp('input.png')
.webp({ lossless: true })
.toFile('output.webp');
// Near-lossless compression
sharp('input.png')
.webp({ nearLossless: true, quality: 60 })
.toFile('output.webp');AVIF Format
Basic Usage
javascript
sharp('input.jpg')
.avif()
.toFile('output.avif');AVIF Options
javascript
sharp('input.jpg')
.avif({
quality: 80, // Quality (1-100)
lossless: false, // Lossless compression
effort: 4, // Compression effort (0-6)
chromaSubsampling: '4:4:4', // Chroma subsampling
force: false // Force AVIF output
})
.toFile('output.avif');TIFF Format
Basic Usage
javascript
sharp('input.jpg')
.tiff()
.toFile('output.tiff');TIFF Options
javascript
sharp('input.jpg')
.tiff({
quality: 80, // Quality (1-100)
compression: 'jpeg', // Compression method
pyramid: false, // Pyramid mode
tile: false, // Tiled mode
tileSize: 256, // Tile size
xres: 1, // X resolution
yres: 1, // Y resolution
resolutionUnit: 'inch', // Resolution unit
force: false // Force TIFF output
})
.toFile('output.tiff');Compression Options
javascript
// JPEG compression
sharp('input.jpg').tiff({ compression: 'jpeg' })
// LZW compression
sharp('input.jpg').tiff({ compression: 'lzw' })
// No compression
sharp('input.jpg').tiff({ compression: 'none' })
// Deflate compression
sharp('input.jpg').tiff({ compression: 'deflate' })Raw Format
Output Raw Pixel Data
javascript
// Output RGB raw data
const rawData = await sharp('input.jpg')
.raw()
.toBuffer();
// Output RGBA raw data
const rawData = await sharp('input.jpg')
.ensureAlpha()
.raw()
.toBuffer();Multi-format Output
Output Multiple Formats Simultaneously
javascript
const image = sharp('input.jpg').resize(800, 600);
// Output multiple 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')
]);Responsive Images
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);
}Format Detection
Auto-select Format Based on File Extension
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;
}
}Performance Optimization
Stream Output
javascript
const fs = require('fs');
// Stream processing
fs.createReadStream('input.jpg')
.pipe(sharp().jpeg({ quality: 80 }))
.pipe(fs.createWriteStream('output.jpg'));Memory Optimization
javascript
// Use Buffer instead of files
const buffer = await sharp('input.jpg')
.jpeg({ quality: 80 })
.toBuffer();
// Output directly to response
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);
});