Modalansicht in der Bildergalerie

04.11.2025 17:43
#1 Modalansicht in der Bildergalerie
avatar
Mitglied

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>


 Antworten

 Beitrag melden
04.11.2025 17:54
#2 RE: Modalansicht in der Bildergalerie
avatar
Mitglied

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.


 Antworten

 Beitrag melden
05.11.2025 00:32
#3 RE: Modalansicht in der Bildergalerie
avatar
Mitglied

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>


 Antworten

 Beitrag melden
05.11.2025 18:47
avatar  Olaf
#4 RE: Modalansicht in der Bildergalerie
Ol
Mitglied

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

__________________________

http://138600.homepagemodules.de/

 Antworten

 Beitrag melden
05.11.2025 22:05 (zuletzt bearbeitet: 05.11.2025 22:06)
#5 RE: Modalansicht in der Bildergalerie
avatar
Mitglied

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.


 Antworten

 Beitrag melden
09.11.2025 11:16
#6 RE: Modalansicht in der Bildergalerie
avatar
Mitglied

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>


 Antworten

 Beitrag melden
10.11.2025 08:56
avatar  Ingmar
#7 RE: Modalansicht in der Bildergalerie
avatar
Technik

Zitat von spotter46 im Beitrag #5
Vielleicht äußert sich ja einer der Supporter von Miranus zum Thema, insbesondere zu Cors.


Bilder können nicht einfach per Javascript abgerufen werden. Das ist der Sinn von CORS und das wird sich nicht ändern.

Viele Grüße,
Ingmar


 Technik · Homepagemodules.de · Miranus GmbH

 Antworten

 Beitrag melden
10.11.2025 09:02 (zuletzt bearbeitet: 10.11.2025 09:10)
#8 RE: Modalansicht in der Bildergalerie
avatar
Mitglied

Zitat von Ingmar im Beitrag #7
Das ist der Sinn von CORS und das wird sich nicht ändern


Schade, denn leider ändern sich auch die Ausfälle des Xobor-eigenen Exif-Viewer Plugins nicht.

Nur deshalb meine geschilderten Bemühungen.


 Antworten

 Beitrag melden
Bereits Mitglied?
Jetzt anmelden!
Mitglied werden?
Jetzt registrieren!