Ausgabeformat-API
Sharp unterstützt verschiedene Bildausgabeformate, jedes mit spezifischen Optionen und Verwendungszwecken.
JPEG-Format
Grundlegende Verwendung
javascript
import sharp from 'sharp';
sharp('input.png')
.jpeg()
.toFile('output.jpg');JPEG-Optionen
javascript
sharp('input.png')
.jpeg({
quality: 80, // Qualität (1-100)
progressive: false, // Progressives JPEG
chromaSubsampling: '4:4:4', // Chroma-Subsampling
mozjpeg: false, // mozjpeg-Encoder verwenden
trellisQuantisation: false, // Trellis-Quantisierung
overshootDeringing: false, // Overshoot-Entklingeln
optimiseScans: false, // Scans optimieren
quantisationTable: 0 // Quantisierungstabelle
})
.toFile('output.jpg');Qualitätseinstellungen
javascript
// Hohe Qualität
sharp('input.png').jpeg({ quality: 95 })
// Mittlere Qualität
sharp('input.png').jpeg({ quality: 80 })
// Niedrige Qualität (kleine Datei)
sharp('input.png').jpeg({ quality: 50 })PNG-Format
Grundlegende Verwendung
javascript
sharp('input.jpg')
.png()
.toFile('output.png');PNG-Optionen
javascript
sharp('input.jpg')
.png({
progressive: false, // Progressives PNG
compressionLevel: 6, // Komprimierungsstufe (0-9)
adaptiveFiltering: false, // Adaptives Filtern
palette: false, // Palettenmodus
quality: 100, // Qualität (nur für Palettenmodus)
colours: 256, // Farbanzahl (nur für Palettenmodus)
dither: 0.5, // Dithering (0-1)
force: false // PNG-Ausgabe erzwingen
})
.toFile('output.png');Transparenzbehandlung
javascript
// Transparenz beibehalten
sharp('input.png')
.png()
.toFile('output.png');
// Weißen Hintergrund hinzufügen
sharp('input.png')
.flatten({ background: { r: 255, g: 255, b: 255 } })
.png()
.toFile('output.png');WebP-Format
Grundlegende Verwendung
javascript
sharp('input.jpg')
.webp()
.toFile('output.webp');WebP-Optionen
javascript
sharp('input.jpg')
.webp({
quality: 80, // Qualität (1-100)
alphaQuality: 100, // Transparenzqualität (1-100)
lossless: false, // Verlustfreie Komprimierung
nearLossless: false, // Nahezu verlustfreie Komprimierung
smartSubsample: false, // Intelligentes Subsampling
reductionEffort: 4, // Komprimierungsaufwand (0-6)
mixed: false, // Gemischter Modus
force: false // WebP-Ausgabe erzwingen
})
.toFile('output.webp');Verlustfreies WebP
javascript
// Verlustfreie Komprimierung
sharp('input.png')
.webp({ lossless: true })
.toFile('output.webp');
// Nahezu verlustfreie Komprimierung
sharp('input.png')
.webp({ nearLossless: true, quality: 60 })
.toFile('output.webp');AVIF-Format
Grundlegende Verwendung
javascript
sharp('input.jpg')
.avif()
.toFile('output.avif');AVIF-Optionen
javascript
sharp('input.jpg')
.avif({
quality: 80, // Qualität (1-100)
lossless: false, // Verlustfreie Komprimierung
effort: 4, // Komprimierungsaufwand (0-6)
chromaSubsampling: '4:4:4', // Chroma-Subsampling
force: false // AVIF-Ausgabe erzwingen
})
.toFile('output.avif');TIFF-Format
Grundlegende Verwendung
javascript
sharp('input.jpg')
.tiff()
.toFile('output.tiff');TIFF-Optionen
javascript
sharp('input.jpg')
.tiff({
quality: 80, // Qualität (1-100)
compression: 'jpeg', // Komprimierungsmethode
pyramid: false, // Pyramidenmodus
tile: false, // Kachelmodus
tileSize: 256, // Kachelgröße
xres: 1, // X-Auflösung
yres: 1, // Y-Auflösung
resolutionUnit: 'inch', // Auflösungseinheit
force: false // TIFF-Ausgabe erzwingen
})
.toFile('output.tiff');Komprimierungsoptionen
javascript
// JPEG-Komprimierung
sharp('input.jpg').tiff({ compression: 'jpeg' })
// LZW-Komprimierung
sharp('input.jpg').tiff({ compression: 'lzw' })
// Keine Komprimierung
sharp('input.jpg').tiff({ compression: 'none' })
// Deflate-Komprimierung
sharp('input.jpg').tiff({ compression: 'deflate' })Rohes Format (raw)
Rohe Pixeldaten ausgeben
javascript
// RGB-Rohdaten ausgeben
const rawData = await sharp('input.jpg')
.raw()
.toBuffer();
// RGBA-Rohdaten ausgeben
const rawData = await sharp('input.jpg')
.ensureAlpha()
.raw()
.toBuffer();Mehrformat-Ausgabe
Mehrere Formate gleichzeitig ausgeben
javascript
const image = sharp('input.jpg').resize(800, 600);
// Mehrere Formate ausgeben
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 Bilder
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);
}Formaterkennung
Format automatisch nach Dateierweiterung auswählen
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;
}
}Leistungsoptimierung
Stream-Ausgabe
javascript
const fs = require('fs');
// Stream-Verarbeitung
fs.createReadStream('input.jpg')
.pipe(sharp().jpeg({ quality: 80 }))
.pipe(fs.createWriteStream('output.jpg'));Speicheroptimierung
javascript
// Buffer statt Datei verwenden
const buffer = await sharp('input.jpg')
.jpeg({ quality: 80 })
.toBuffer();
// Direkt an Antwort ausgeben
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);
});