Bitte geben Sie einen Grund für die Verwarnung an
Der Grund erscheint unter dem Beitrag.Bei einer weiteren Verwarnung wird das Mitglied automatisch gesperrt.
Modalansicht in der Bildergalerie
Vor einiger Zeit hatte @Wolfgang mir ein privates Plugin geschickt "Modalansicht in der Bildergalerie", das es ermöglicht, ein geöffnetes Bild formatfüllend anzeigen zu lassen, ohne dass ein zusätzlicher Tab im Browser geöffnet wird.
Das Plugin funktioniert einwandfrei und wer möchte, kann das auch als Gast bei uns testen, www.zur-blende.de und dort in der Navi-Leiste entweder auf Bilderliste oder Bilderalben klicken und dann bei einem geöffneten Bild unter dem Bild auf Modal-Ansicht klicken.
Da das Xobor-eigene Plugin Exif-Viewer nur eingeschränkt funktioniert, die Weiterentwicklung nicht geplant ist, kam mir die Idee, den Code in Wolfgang's Plugin so zu erweitern, dass neben dem Bild in einem Zusatzfenster die wichtigsten Exif-Daten angezeigt werden.
Mangels entsprechender Kenntnisse, habe ich es sowohl mit Google's GEMINI als auch mit CHatGPT versucht.
Obwohl Exif-Daten im angezeigten Bild vorhanden sind, diese auch per rechte Maustaste über ein Browser-Plugin ausgelesen werden, scheiterte ChatGPT letztlich daran, dass die Datenauslesung irgendwo blockiert wird.
Vielleicht findet jemand von euch die Lösung des Knotens, nicht nur mein Dank wäre ihr/ihm sicher.
Hier der Code von ChatGPT
<style>
.myImgModal2 { display:flex;cursor: pointer; background:#aaaaaa; width:40px !important; margin:5px auto; padding: 3px; border: 1px solid #aaaaaa;}
.myImgModal2:hover {opacity: 0.7;}
#closeImg {position: absolute; top: 0px; right: 15px; color: #f1f1f1; font-size: 40px; font-weight: bold; padding:20px;}
#closeImg:hover, .close:focus {color: #ff8000; text-decoration: none; cursor: pointer;}
#myModal {display: none; position: fixed; z-index: 999999; left: 0; top: 0; width: 100%; height: 100%; background-color: rgb(28,28,28);}
#imgAll {position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); max-height: 98%; max-width: 98%; margin: 0; cursor:pointer; object-fit: scale-down;}
</style>
<div id="myModal">
<div id="closeImg">×</div>
<img id="imgAll">
</div>
<script>
ImageLoad =
{{template==144.start}}$('.gallpic'){{template==144.end}}
{{template!==144.start}}$('#PicMainCont'){{template!==144.end}}
ImageLoad.after('<div style="margin:15px 0 10px 0;"><img title="Ein Klick führt zur Modal-Ansicht" class="myImgModal2" src="{{gallery_dl_link}}">Modal-Ansicht</div>');
$('.myImgModal2').click(function(){
$('body').css('overflow','hidden');
$('#myModal').fadeIn(500).click(function(){
$('body').css('overflow','auto');
$('#myModal').hide(500);
});
$('#imgAll').attr('src', $(this).attr('src'));
});
</script>
Nachtrag und vielleicht ein wichtiger Hinweis der KI:
Dass die Daten über ein Browser-Plugin oder die rechte Maustaste ausgelesen werden können, liefert uns den entscheidenden Hinweis: Die EXIF-Daten sind im Bild vorhanden, aber Ihr JavaScript wird beim Versuch, diese zu lesen, blockiert.
Browser-Plugins haben oft erweiterte Berechtigungen, die die normale Same-Origin Policy (CORS) umgehen können, während Ihr Skript an diese strengen Sicherheitsregeln gebunden ist.
🛑 Fazit: Es ist (fast) sicher der Server
Da die Daten im Bild sind und die Code-Reparaturen das clientseitige Auslesen erleichtern sollten, liegt das Problem mit 99%iger Sicherheit an der Konfiguration Ihres Webservers.
Ihr Server sendet den HTTP-Header nicht, der dem Browser mitteilt, dass die Bilder für JavaScript von Ihrer Domain aus lesbar sind. Das Attribut crossorigin="anonymous" im HTML fordert diesen Header an, aber wenn der Server ihn nicht liefert, blockiert der Browser die Aktion.
Sorry, der Code in Beitrag #1 ist das Original von Wolfgang.
Hier nun der Code von ChatGPT
<script src="https://cdn.jsdelivr.net/npm/exif-js"></script>
<style>
/* Standard-Modal-Stile */
.myImgModal2 { display:flex;cursor: pointer; background:#aaaaaa; width:40px !important; margin:5px auto; padding: 3px; border: 1px solid #aaaaaa;}
.myImgModal2:hover {opacity: 0.7;}
#closeImg {position: absolute; top: 0px; right: 15px; color: #f1f1f1; font-size: 40px; font-weight: bold; padding:20px; z-index: 1000001;}
#closeImg:hover, .close:focus {color: #ff8000; text-decoration: none; cursor: pointer;}
#myModal {display: none; position: fixed; z-index: 999999; left: 0; top: 0; width: 100%; height: 100%; background-color: rgb(28,28,28);}
#imgAll {position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); max-height: 98%; max-width: 98%; margin: 0; cursor:pointer; object-fit: scale-down;}
/* Stil für die EXIF-Box */
#exifData {
position: absolute;
top: 50%;
right: 0;
transform: translateY(-50%);
background-color: rgba(255, 255, 255, 0.9);
color: #1c1c1c;
padding: 15px;
border-radius: 5px 0 0 5px;
max-width: 250px;
box-shadow: 0 0 10px rgba(0,0,0,0.5);
font-family: Arial, sans-serif;
font-size: 14px;
line-height: 1.4;
max-height: 90%;
overflow-y: auto;
z-index: 1000000;
}
#exifData h4 {
margin-top: 0;
padding-bottom: 5px;
border-bottom: 1px solid #ccc;
font-size: 16px;
}
#exifData p {
margin: 3px 0;
}
</style>
<div id="myModal">
<div id="closeImg">×</div>
<img id="imgAll" alt="Galeriebild in Modal-Ansicht" crossorigin="anonymous">
<div id="exifData" style="display:none;">
<h4>EXIF-Daten</h4>
<p id="exif-make"></p>
<p id="exif-model"></p>
<p id="exif-focal35"></p>
<p id="exif-shutter"></p>
<p id="exif-aperture"></p>
<p id="exif-iso"></p>
<p id="exif-not-found" style="display:none; color: red;">Keine EXIF-Daten gefunden.</p>
</div>
</div>
<script>
// START: Eingekapseltes Skript, um jQuery-Konflikte zu vermeiden
(function($) {
// Hilfsfunktion zur Formatierung rationaler Werte (Bruch) wie 1/125 s
function formatRational(tagValue) {
if (Array.isArray(tagValue) && tagValue.length === 2) {
const numerator = tagValue[0];
const denominator = tagValue[1];
if (denominator === 0) return 'N/A';
const value = numerator / denominator;
if (denominator === 1) return numerator.toString();
if (value < 1 && value > 0) {
return `1/${Math.round(1 / value)}`;
}
return value.toFixed(1);
}
return tagValue;
}
// Funktion zum Auslesen und Anzeigen der EXIF-Daten
function displayExifData(imgElement) {
document.getElementById('exifData').style.display = 'none';
document.getElementById('exif-not-found').style.display = 'none';
EXIF.getData(imgElement, function() {
const allTags = EXIF.getAllTags(this);
// Datenprüfung
if (!allTags || !allTags.Make) {
document.getElementById('exif-not-found').style.display = 'block';
document.getElementById('exifData').style.display = 'block';
document.getElementById('exif-make').innerText = 'Hersteller: N/A';
document.getElementById('exif-model').innerText = 'Modell: N/A';
document.getElementById('exif-focal35').innerText = 'Brennweite: N/A';
document.getElementById('exif-shutter').innerText = 'Belichtungszeit: N/A';
document.getElementById('exif-aperture').innerText = 'Blende: N/A';
document.getElementById('exif-iso').innerText = 'ISO-Wert: N/A';
return;
}
// Werte auslesen
const make = EXIF.getTag(this, "Make") || 'Unbekannt';
const model = EXIF.getTag(this, "Model") || 'N/A';
let focalLength35mm = EXIF.getTag(this, "FocalLengthIn35mmFilm");
const focalLength = EXIF.getTag(this, "FocalLength");
if (focalLength35mm) {
focalLength35mm = `${focalLength35mm} mm (KB-Äquiv.)`;
} else if (focalLength) {
focalLength35mm = `${formatRational(focalLength)} mm (Real)`;
} else {
focalLength35mm = 'N/A';
}
const exposureTime = EXIF.getTag(this, "ExposureTime");
const shutter = exposureTime ? `${formatRational(exposureTime)} s` : 'N/A';
const aperture = EXIF.getTag(this, "FNumber");
const fValue = aperture ? `f/${formatRational(aperture)}` : 'N/A';
const iso = EXIF.getTag(this, "ISOSpeedRatings") || 'N/A';
// Werte im Modal anzeigen
document.getElementById('exif-make').innerText = `Hersteller: ${make}`;
document.getElementById('exif-model').innerText = `Modell: ${model}`;
document.getElementById('exif-focal35').innerText = `Brennweite: ${focalLength35mm}`;
document.getElementById('exif-shutter').innerText = `Belichtungszeit: ${shutter}`;
document.getElementById('exif-aperture').innerText = `Blende: ${fValue}`;
document.getElementById('exif-iso').innerText = `ISO-Wert: ${iso}`;
document.getElementById('exifData').style.display = 'block';
});
}
// Ihr ursprünglicher Select-Befehl
ImageLoad =
{{template==144.start}}$('.gallpic'){{template==144.end}}
{{template!==144.start}}$('#PicMainCont'){{template!==144.end}}
ImageLoad.after('<div style="margin:15px 0 10px 0;"><img title="Ein Klick führt zur Modal-Ansicht" class="myImgModal2" src="{{gallery_dl_link}}">Modal-Ansicht</div>');
$('.myImgModal2').click(function(){
$('body').css('overflow','hidden');
const imgSrc = $(this).attr('src');
$('#imgAll').attr('src', imgSrc);
$('#myModal').fadeIn(500);
// Bild geladen? Dann EXIF-Daten auslesen
$('#imgAll').off('load').one('load', function() {
displayExifData(this);
}).each(function() {
if(this.complete) $(this).trigger('load');
});
// Schließ-Logik
$('#myModal').off('click').on('click', function(e){
if (e.target.id === 'myModal' || e.target.id === 'closeImg') {
$('body').css('overflow','auto');
$('#exifData').hide();
$('#myModal').hide(500);
}
});
// Schließen-Button
$('#closeImg').off('click').on('click', function() {
$('body').css('overflow','auto');
$('#exifData').hide();
$('#myModal').hide(500);
});
});
})(jQuery);
// ENDE: Eingekapseltes Skript
</script>
Du hast es schon im Beitrag #2 richtig ermittelt.
Der Server von Miranus meldet den Browser keine Freigabe (CORS),um die Exif Datei auszulesen.
Es bleibt nur die CORS Sperre zu umgehen,wenn Du die Dateien auf einen eigenen Webserver mit Freigabe (Access-Control-Allow-Origin) der Exif Dateien lädst.Danach kann der Browser die Exif Datei lesen und anzeigen.Das geht auch,wenn Du die Datei vorher auf Deinen PC lädst und danach wieder im Browser hochlädst.
Gruß
Olaf
#5 RE: Modalansicht in der Bildergalerie
Danke @Olaf
Vielleicht äußert sich ja einer der Supporter von Miranus zum Thema, insbesondere zu Cors.
Alternativ könnte natürlich auch endlich das Exif-Viewer Plugin auf Vordermann gebracht werden, denn dessen "Ausfälle" sind schon peinlich, wenn ich sie meinen Mitgliedern erklären muss.
Da zum Thema Cors bisher kein Lösungsvorschlag kam, habe ich wieder ChatGPT bemüht und bekam einen Code, der für ein neues Plugin genutzt werden könnte.
Hier dazu die Anleitung von ChatGPT
🧩 Anleitung
Geh in deinem Forum auf
Administration → Plugins → Eigenes Script
Klicke auf „Neues Script hinzufügen“
Gib dem Script z. B. den Namen
ExifAnzeige.js
Füge den folgenden Code komplett in das Textfeld ein 👇
Folgendes soll dann passieren:
Zeigt einen Link „Exif-Daten anzeigen“ über jedem geöffneten Bild,
Liest die Exif-Daten direkt im Browser (funktioniert mit allen Kameras),
Zeigt sie in einem kleinen, schönen Fenster an.
Da ich bekannterweise ziemlich ahnungslos bin, benötige ich hierfür Hilfe, denn ich weiß nicht, wie ich das zu einem Plugin verarbeiten könnte.
Hier der Code
<!-- Exif-Anzeige für geöffnete Galeriebilder →
<script src="https://cdn.jsdelivr.net/npm/exifr/dist/lite.umd.js"></script>
<script>
(function() {
'use strict';
// kleine Hilfsfunktion zum Warten, bis ein Bild sichtbar ist
function waitForImage(retries = 20) {
return new Promise(resolve => {
const timer = setInterval(() => {
const img = document.querySelector('.galerie img, #image img, .gallery_image img, img[id^="pic"], img.mainpic');
if (img || --retries <= 0) {
clearInterval(timer);
resolve(img);
}
}, 400);
});
}
// Hauptfunktion: EXIF auslesen und anzeigen
async function showExifData() {
const img = await waitForImage();
if (!img) {
alert("Kein Bild gefunden.");
return;
}
// Fenster vorbereiten
let box = document.getElementById('exifBox');
if (!box) {
box = document.createElement('div');
box.id = 'exifBox';
box.style.position = 'absolute';
box.style.top = '70px';
box.style.left = '20px';
box.style.background = 'rgba(255,255,255,0.95)';
box.style.border = '1px solid #ccc';
box.style.padding = '10px';
box.style.maxWidth = '400px';
box.style.zIndex = '9999';
box.style.boxShadow = '0 2px 10px rgba(0,0,0,0.2)';
document.body.appendChild(box);
}
box.innerHTML = "Lade Exif-Daten ...";
try {
const exif = await exifr.parse(img.src);
if (!exif) {
box.innerHTML = "Keine Exif-Daten gefunden.";
return;
}
let html = "<b>Exif-Daten:</b><br>";
const keys = ['Make','Model','LensModel','FocalLength','FNumber','ExposureTime','ISO','DateTimeOriginal'];
keys.forEach(k => {
if (exif[k]) html += `${k}: ${exif[k]}<br>`;
});
if (html === "<b>Exif-Daten:</b><br>") {
for (const [key, val] of Object.entries(exif)) {
html += `${key}: ${val}<br>`;
}
}
box.innerHTML = html + '<br><a href="#" id="closeExif">[Schließen]</a>';
document.getElementById('closeExif').onclick = e => { e.preventDefault(); box.style.display = 'none'; };
} catch (err) {
console.error(err);
box.innerHTML = "Fehler beim Lesen der Exif-Daten.";
}
}
// Link zum Anzeigen einfügen
function addExifLink() {
if (document.getElementById('exifLink')) return;
const header = document.querySelector('#content h1, .galerie h1, .gallery_headline, .pichead, .gallery_header');
if (!header) return;
const link = document.createElement('a');
link.id = 'exifLink';
link.href = '#';
link.textContent = 'Exif-Daten anzeigen';
link.style.marginLeft = '15px';
link.onclick = e => { e.preventDefault(); showExifData(); };
header.appendChild(link);
}
// Bei Seitenladeende starten
document.addEventListener('DOMContentLoaded', () => {
setTimeout(addExifLink, 800);
});
})();
</script>
#8 RE: Modalansicht in der Bildergalerie
- Informationen
- Aktuelle News
- Forum Tutorials - Tipps und Anleitungen
- SEO / Werbung fürs Forum
- Verwaltung
- Extras
- Design
- Plugin(system)
- Eure Fragen zu Tutorials
- Forum Support
- Fragen und Antworten
- Pluginsystem
- Plugins
- Templates & Sprachen
- Bugreport
- Verbesserungsvorschläge
- Sponsoren gesucht
- Das neue Xobor Business-Template
- News und Updates
- Bugreport
- Allgemeines Feedback
- Verbesserungsvorschläge
- Sonstiges
- Kaffeeklatsch
- Lob & Kritik
- Verbesserungsvorschläge
- Allgemeine Fragen
- Fehlermeldungen
- Verbesserungsvorschläge Responsive Design
- Bugreport Responsive Design
- Archiv - Alter Betatest
- Responsive Design - Verbesserungsvorschläge
- Responsive Design - Bugreport
- Fragen zum neuen Template
- Neue Administration Beta Test
- Bugreport Neue Administration
- Allgemeines Fragen & Feedback
- Verbesserungsvorschläge zur neuen Administration
- Shoutbox
Ähnliche Themen
Jetzt anmelden!
Jetzt registrieren!
© 2017 Xobor | Forum-Software
Technik ·