Dieser Commit ist enthalten in:
Claude Project Manager
2025-07-10 23:55:34 +02:00
Ursprung 3f2a2fc4dc
Commit a2154e2a30
11 geänderte Dateien mit 283 neuen und 210 gelöschten Zeilen

97
app.js
Datei anzeigen

@ -311,9 +311,14 @@ function createMetadataSection(title, data, icon = '📋', cssClass = '') {
for (const [key, value] of Object.entries(data)) {
const formattedKey = formatMetadataKey(key);
const formattedValue = formatMetadataValue(key, value);
const tooltip = getMetadataTooltip(key, formattedKey);
html += `
<tr>
<td>${formattedKey}</td>
<td>
${formattedKey}
${tooltip ? `<span class="info-icon" title="${tooltip}"><img src="icons/info.svg" alt="Info"></span>` : ''}
</td>
<td>${formattedValue}</td>
</tr>
`;
@ -518,29 +523,48 @@ function formatMetadataKey(key) {
// Remove common prefixes and format
key = key.replace(/^(EXIF|GPS|IPTC|XMP)/, '');
// Add spaces before capital letters
key = key.replace(/([A-Z])/g, ' $1').trim();
// Special formatting for known keys
// Special formatting for known keys - do first before adding spaces
const keyMap = {
'Make': 'Kamera-Hersteller',
'Model': 'Kamera-Modell',
'DateTime Original': 'Aufnahmedatum',
'DateTimeOriginal': 'Aufnahmedatum',
'Exposure Time': 'Belichtungszeit',
'ExposureTime': 'Belichtungszeit',
'F Number': 'Blende',
'FNumber': 'Blende',
'ISO Speed Ratings': 'ISO-Wert',
'ISOSpeedRatings': 'ISO-Wert',
'Focal Length': 'Brennweite',
'FocalLength': 'Brennweite',
'Flash': 'Blitz',
'GPS Latitude': 'Breitengrad',
'GPSLatitude': 'Breitengrad',
'GPS Longitude': 'Längengrad',
'GPSLongitude': 'Längengrad',
'GPS Altitude': 'Höhe',
'GPSAltitude': 'Höhe',
'Lens Model': 'Objektiv',
'LensModel': 'Objektiv',
'White Balance': 'Weißabgleich',
'WhiteBalance': 'Weißabgleich',
'Exposure Mode': 'Belichtungsmodus',
'Color Space': 'Farbraum'
'ExposureMode': 'Belichtungsmodus',
'Color Space': 'Farbraum',
'ColorSpace': 'Farbraum'
};
return keyMap[key.trim()] || key;
// Check if we have a known key first
if (keyMap[key]) {
return keyMap[key];
}
// Add spaces before capital letters but preserve acronyms
key = key.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2'); // For cases like "GPSLatitude" -> "GPS Latitude"
key = key.replace(/([a-z\d])([A-Z])/g, '$1 $2'); // For cases like "dateTime" -> "date Time"
key = key.trim();
return keyMap[key] || key;
}
// Format metadata values for display
@ -632,6 +656,65 @@ let currentFileData = null;
let currentMetadata = null;
let currentPreviewUrl = null;
// Get tooltips for metadata fields
function getMetadataTooltip(key, formattedKey) {
const tooltips = {
'ISO-Wert': 'Die Lichtempfindlichkeit des Kamerasensors. Höhere Werte (z.B. 1600) bedeuten mehr Empfindlichkeit, aber auch mehr Bildrauschen.',
'Blende': 'Die Öffnung des Objektivs (f-Zahl). Kleinere Zahlen (z.B. f/1.8) bedeuten eine größere Öffnung und mehr Licht.',
'Belichtungszeit': 'Wie lange der Kamerasensor dem Licht ausgesetzt ist. Z.B. 1/100 bedeutet eine Hundertstelsekunde.',
'Brennweite': 'Der Abstand zwischen Objektiv und Sensor in Millimetern. Bestimmt den Bildausschnitt.',
'Weißabgleich': 'Einstellung zur korrekten Farbwiedergabe unter verschiedenen Lichtbedingungen.',
'Belichtungsmodus': 'Automatik, Manuell, Blendenpriorität oder Zeitpriorität - bestimmt wie die Kamera die Belichtung steuert.',
'Farbraum': 'Definiert den Bereich der darstellbaren Farben (z.B. sRGB für Web, Adobe RGB für Druck).',
'Breitengrad': 'GPS-Koordinate für die Nord-Süd-Position des Aufnahmeortes.',
'Längengrad': 'GPS-Koordinate für die Ost-West-Position des Aufnahmeortes.',
'Höhe': 'Höhe über dem Meeresspiegel am Aufnahmeort.',
'Objektiv': 'Das verwendete Kameraobjektiv mit seinen technischen Eigenschaften.',
'Blitz': 'Informationen darüber, ob und wie der Blitz verwendet wurde.',
'ExposureCompensation': 'Belichtungskorrektur - manuelle Anpassung der automatischen Belichtung.',
'MeteringMode': 'Messmethode für die Belichtung (Spot, Matrix, Mittenbetont).',
'FocalLengthIn35mmFilm': 'Brennweite umgerechnet auf Kleinbildformat für bessere Vergleichbarkeit.',
'DigitalZoomRatio': 'Digitaler Zoom-Faktor - elektronische Vergrößerung mit Qualitätsverlust.',
'SceneCaptureType': 'Art der Aufnahme (Landschaft, Portrait, Nachtaufnahme).',
'SubjectDistanceRange': 'Entfernungsbereich zum Motiv (Makro, Nah, Fern).',
'Sharpness': 'Nachschärfung - digitale Kantenbetonung des Bildes.',
'Saturation': 'Farbsättigung - Intensität der Farben im Bild.',
'Contrast': 'Kontrast - Unterschied zwischen hellen und dunklen Bereichen.',
'GainControl': 'Verstärkungsregelung - elektronische Signalverstärkung bei wenig Licht.',
// Neue Erklärungen
'ApertureValue': 'Blendenwert in APEX-Einheiten - technische Darstellung der Blendenöffnung für Berechnungen.',
'Aperture Value': 'Blendenwert in APEX-Einheiten - technische Darstellung der Blendenöffnung für Berechnungen.',
'ExposureBiasValue': 'Belichtungskorrektur in EV-Stufen. +1 bedeutet doppelt so hell, -1 halb so hell.',
'Exposure Bias Value': 'Belichtungskorrektur in EV-Stufen. +1 bedeutet doppelt so hell, -1 halb so hell.',
'MaxApertureValue': 'Größte Blendenöffnung des Objektivs (kleinste f-Zahl) - bestimmt die maximale Lichtmenge.',
'Max Aperture Value': 'Größte Blendenöffnung des Objektivs (kleinste f-Zahl) - bestimmt die maximale Lichtmenge.',
'ExposureProgram': 'Kameraeinstellung: 0=Unbekannt, 1=Manuell, 2=Normal, 3=Blendenpriorität, 4=Zeitpriorität, 5=Kreativ, 6=Action, 7=Portrait, 8=Landschaft.',
'Exposure Program': 'Kameraeinstellung: 0=Unbekannt, 1=Manuell, 2=Normal, 3=Blendenpriorität, 4=Zeitpriorität, 5=Kreativ, 6=Action, 7=Portrait, 8=Landschaft.',
'SubSampling': 'Farbunterabtastung bei JPEG - bestimmt wie Farbinformationen gespeichert werden (4:2:2 oder 4:2:0).',
'YCbCrSubSampling': 'Farbunterabtastung bei JPEG - bestimmt wie Farbinformationen gespeichert werden (4:2:2 oder 4:2:0).',
'Orientation': 'Bildausrichtung: 1=Normal, 3=180° gedreht, 6=90° rechts gedreht, 8=90° links gedreht.',
'YCbCrPositioning': 'Position der Farbinformationen: 1=Zentriert (üblich), 2=Co-sited (professionell).',
'Y Cb Cr Positioning': 'Position der Farbinformationen: 1=Zentriert (üblich), 2=Co-sited (professionell).',
'ExifIFDPointer': 'Technischer Verweis auf den Speicherort der EXIF-Daten in der Datei.',
'EXIF IFD Pointer': 'Technischer Verweis auf den Speicherort der EXIF-Daten in der Datei.',
'ExifVersion': 'Version des EXIF-Standards (z.B. 0232 = Version 2.32) - bestimmt verfügbare Metadatenfelder.',
'EXIF Version': 'Version des EXIF-Standards (z.B. 0232 = Version 2.32) - bestimmt verfügbare Metadatenfelder.',
'ShutterSpeedValue': 'Verschlusszeit in APEX-Einheiten - technische Darstellung für Berechnungen.',
'Shutter Speed Value': 'Verschlusszeit in APEX-Einheiten - technische Darstellung für Berechnungen.',
'BrightnessValue': 'Objekthelligkeit in APEX-Einheiten - Messwert der Motivhelligkeit.',
'Brightness Value': 'Objekthelligkeit in APEX-Einheiten - Messwert der Motivhelligkeit.',
'OffsetTime': 'Zeitzonenversatz zur UTC-Zeit bei der Aufnahme (z.B. +02:00 für MESZ).',
'Offset Time': 'Zeitzonenversatz zur UTC-Zeit bei der Aufnahme (z.B. +02:00 für MESZ).',
'OffsetTimeOriginal': 'Ursprünglicher Zeitzonenversatz bei der Aufnahme - bleibt bei Bearbeitung erhalten.',
'Offset Time Original': 'Ursprünglicher Zeitzonenversatz bei der Aufnahme - bleibt bei Bearbeitung erhalten.',
'ImageUniqueID': 'Einzigartige Bild-ID aus Datum, Kameraseriennummer und Bildnummer - identifiziert das Bild eindeutig.',
'Image Unique ID': 'Einzigartige Bild-ID aus Datum, Kameraseriennummer und Bildnummer - identifiziert das Bild eindeutig.'
};
// Check both the original key and formatted key
return tooltips[formattedKey] || tooltips[key] || null;
}
// Generate PDF report
async function generateReport() {
if (!currentFileData) {