Metadaten-API
Sharp bietet umfangreiche Metadatenoperationsfunktionen zum Lesen, Ändern und Schreiben von Bildmetadaten.
Metadaten lesen
Grundlegende Verwendung
javascript
import sharp from 'sharp';
// Bildmetadaten lesen
const metadata = await sharp('input.jpg').metadata();
console.log(metadata);Metadatenobjektstruktur
javascript
{
format: 'jpeg', // Bildformat
width: 1920, // Breite
height: 1080, // Höhe
space: 'srgb', // Farbraum
channels: 3, // Kanalanzahl
depth: 'uchar', // Bittiefe
density: 72, // Auflösung
hasProfile: false, // Ob Farbprofil vorhanden ist
hasAlpha: false, // Ob Alphakanal vorhanden ist
isOpaque: true, // Ob undurchsichtig
orientation: 1, // EXIF-Ausrichtung
exif: { ... }, // EXIF-Daten
icc: { ... }, // ICC-Profil
iptc: { ... }, // IPTC-Daten
xmp: { ... }, // XMP-Daten
tifftagPhotoshop: { ... } // Photoshop TIFF-Tags
}EXIF-Daten
EXIF lesen
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.exif) {
console.log('EXIF-Daten:', metadata.exif);
// EXIF-Daten parsen
const exif = sharp.exif(metadata.exif);
console.log('Aufnahmezeit:', exif.DateTime);
console.log('Kameramodell:', exif.Model);
console.log('ISO:', exif.ISOSpeedRatings);
}EXIF schreiben
javascript
// EXIF-Daten erstellen
const exif = sharp.exif({
IFD0: {
ImageDescription: 'Mit Sharp verarbeitetes Bild',
Copyright: '© 2024'
},
IFD1: {
Orientation: 1
},
EXIF: {
DateTimeOriginal: new Date().toISOString(),
UserComment: 'Mit Sharp verarbeitet'
}
});
// EXIF-Daten schreiben
await sharp('input.jpg')
.withMetadata({ exif })
.jpeg()
.toFile('output.jpg');ICC-Farbprofile
ICC-Profil lesen
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.icc) {
console.log('ICC-Profil:', metadata.icc);
}ICC-Profil einbetten
javascript
// sRGB-Profil einbetten
await sharp('input.jpg')
.withMetadata({ icc: 'srgb' })
.jpeg()
.toFile('output.jpg');
// Benutzerdefiniertes ICC-Profil einbetten
const iccProfile = fs.readFileSync('custom.icc');
await sharp('input.jpg')
.withMetadata({ icc: iccProfile })
.jpeg()
.toFile('output.jpg');IPTC-Daten
IPTC lesen
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.iptc) {
console.log('IPTC-Daten:', metadata.iptc);
}IPTC schreiben
javascript
const iptc = {
'2:05': 'Object Name',
'2:15': 'Category',
'2:25': 'Keywords',
'2:55': 'Date Created',
'2:80': 'By-line',
'2:116': 'Copyright'
};
await sharp('input.jpg')
.withMetadata({ iptc })
.jpeg()
.toFile('output.jpg');XMP-Daten
XMP lesen
javascript
const metadata = await sharp('input.jpg').metadata();
if (metadata.xmp) {
console.log('XMP-Daten:', metadata.xmp);
}XMP schreiben
javascript
const xmp = `
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>Mit Sharp verarbeitetes Bild</dc:title>
<dc:creator>Sharp</dc:creator>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
`;
await sharp('input.jpg')
.withMetadata({ xmp })
.jpeg()
.toFile('output.jpg');Ausrichtungsinformationen
Ausrichtung lesen
javascript
const metadata = await sharp('input.jpg').metadata();
console.log('Bildausrichtung:', metadata.orientation);Automatische Rotation
javascript
// Automatisch nach EXIF-Ausrichtung rotieren
await sharp('input.jpg')
.rotate() // Automatische Rotation
.jpeg()
.toFile('output.jpg');Auflösungsinformationen
Auflösung lesen
javascript
const metadata = await sharp('input.jpg').metadata();
console.log('Auflösung:', metadata.density);Auflösung setzen
javascript
await sharp('input.jpg')
.withMetadata({ density: 300 })
.jpeg()
.toFile('output.jpg');Metadaten beibehalten
Alle Metadaten beibehalten
javascript
// Alle vorhandenen Metadaten beibehalten
await sharp('input.jpg')
.resize(800, 600)
.withMetadata()
.jpeg()
.toFile('output.jpg');Selektive Beibehaltung
javascript
// Nur EXIF-Daten beibehalten
await sharp('input.jpg')
.resize(800, 600)
.withMetadata({ exif: true })
.jpeg()
.toFile('output.jpg');
// EXIF und ICC beibehalten
await sharp('input.jpg')
.resize(800, 600)
.withMetadata({ exif: true, icc: true })
.jpeg()
.toFile('output.jpg');Metadaten entfernen
Alle Metadaten entfernen
javascript
// Alle Metadaten entfernen
await sharp('input.jpg')
.resize(800, 600)
.jpeg()
.toFile('output.jpg');Bestimmte Metadaten entfernen
javascript
// EXIF entfernen, aber andere beibehalten
await sharp('input.jpg')
.resize(800, 600)
.withMetadata({ exif: false })
.jpeg()
.toFile('output.jpg');Stapelverarbeitung von Metadaten
Stapelweise lesen
javascript
const fs = require('fs').promises;
async function batchReadMetadata(directory) {
const files = await fs.readdir(directory);
const results = [];
for (const file of files) {
if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
try {
const metadata = await sharp(`${directory}/${file}`).metadata();
results.push({ file, metadata });
} catch (error) {
console.error(`Metadaten für ${file} lesen fehlgeschlagen:`, error.message);
}
}
}
return results;
}Stapelweise schreiben
javascript
async function batchWriteMetadata(directory, metadata) {
const files = await fs.readdir(directory);
for (const file of files) {
if (file.match(/\.(jpg|jpeg|png|webp)$/i)) {
try {
await sharp(`${directory}/${file}`)
.withMetadata(metadata)
.toFile(`${directory}/processed_${file}`);
} catch (error) {
console.error(`Verarbeitung von ${file} fehlgeschlagen:`, error.message);
}
}
}
}Metadatenvalidierung
Metadatengenauigkeit validieren
javascript
async function validateMetadata(filePath) {
try {
const metadata = await sharp(filePath).metadata();
// Grundlegende Eigenschaften prüfen
if (!metadata.width || !metadata.height) {
throw new Error('Abmessungsinformationen fehlen');
}
// Format prüfen
if (!metadata.format) {
throw new Error('Formatinformationen fehlen');
}
// Kanalanzahl prüfen
if (!metadata.channels) {
throw new Error('Kanalinformationen fehlen');
}
return {
valid: true,
metadata
};
} catch (error) {
return {
valid: false,
error: error.message
};
}
}Leistungsoptimierung
Nur benötigte Metadaten lesen
javascript
// Nur grundlegende Informationen lesen, EXIF nicht parsen
const metadata = await sharp('input.jpg')
.metadata({ pages: -1 });
// Nur EXIF lesen
const metadata = await sharp('input.jpg')
.metadata({ exif: true });Stream-Verarbeitung
javascript
const fs = require('fs');
// Metadaten streamweise lesen
const stream = fs.createReadStream('input.jpg');
const metadata = await sharp(stream).metadata();Fehlerbehandlung
javascript
try {
const metadata = await sharp('input.jpg').metadata();
console.log('Metadaten:', metadata);
} catch (error) {
if (error.code === 'VipsForeignLoad') {
console.error('Nicht unterstütztes Bildformat');
} else if (error.code === 'VipsForeignLoadLimit') {
console.error('Bild zu groß');
} else {
console.error('Metadaten lesen fehlgeschlagen:', error.message);
}
}