[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
EXIF Daten aus Fotos auslesen und ausgeben - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

EXIF Daten aus Fotos auslesen und ausgeben

11. Mär 2015, 18:02

Hi,

für Webseiten, die sich mit Fotografie beschäftign, kann es sehr interessant sein, die EXIF Daten der Fotos, die im Medienpool hinterlegt sind, auszulesen und mit dem Foto auszugeben.
Hierfür gibt es auch bereits ein sehr schönes JavaScript von Jan-Niklas Meier.
Dieses lässt sich auch denkbar einfach in eine Webseite integrieren, jedenfalls für Fotos, die einfach via <img src="... eingebunden sind. Ich hab hierfür mal ein kleines, sehr einfaches Beispiel-Modul gebastelt...
Mit jQuery-Galerien, wie Magnific Popup, Lytebox, bxSlider, NivoSilder, AD Gallery etc. funktioniert das so leider nicht, da diese das Original-Bild ja - kurz gesagt - einlesen und weiterverarbeitet ausgeben, sodass entsprechend auch keine EXIF-Daten mehr aus dem Original-Bild zur Verfügung stehen.

Meine Frage:
Sieht jemand eine einfache Möglichkeit, dieses EXIF-Script unkompliziert - insb. in Magnific Popup - so einzubinden, dass auch hier bei entsprechenden Galerien/Fotos die EXIF-Daten mit ausgegeben werden :?: :!:

Benutzeravatar
Oliver.Kreischer
Beiträge: 2508
Registriert: 17. Dez 2004, 00:03
Wohnort: Velbert - LA
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

11. Mär 2015, 19:15

Hi,

guck mal in du das gebrauchen kannst:

github.com/olien/iptc

(Keine Ahnung ob das noch funktioniert ;-))

LG
Oliver
> Friends Of REDAXO Gemeinsame REDAXO-Entwicklung!
> REDAXO Agenturen. Eintragen erwünscht!
> Komm in den Slack Channel Es lohnt sich!

Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

12. Mär 2015, 11:37

Hi,

danke für den Tipp! :D Habs mal ausprobiert. Eine wirklich interessante Erweiterung für den Medienpool, verfolgt aber wohl einen etwas anderen Ansatz.
Ich glaube aber, dass ich wo anders ansetzen muss:
Die ganzen Gallerys (Bsp.: Magnific Popup) lesen die Original-Fotos ein, verkleinern sie für die Galerie u. geben dann d. Original angepasst in einem Fenster wieder aus. die verkleinerten Vorschau-Bilder enthalten natürlich nicht die EXIF-Daten d. Originals und auf das im Java-Fenster ausgegebene Bild hat andere "EXIF-Auslese-Java-Script" keinen Zugriff. Dementsprechend müsste man wohl das ganze EXIF-Script in Magnific Popup etc. integrieren, oder?

Benutzeravatar
RexDude
Beiträge: 2543
Registriert: 22. Apr 2010, 11:24

Re: EXIF Daten aus Fotos auslesen und ausgeben

12. Mär 2015, 11:41

Magnific Popup lässt sich erweitern auf die eigenen Bedürfnisse. Kannst du an die EXIF Daten kommen, so kannst du diese theoretisch an MP weiterleiten. Wie das genau geht musst du bei MP schauen. Es gibt auch sehr viele Cdebeispiele die über Google gefunden werden können wo man sehen kann wie man MP neue Funktionalität beibringt. Ich glaube auch im MP Addon ist ein Link zu solchen Beispielen. Viel Erfolg!

Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

12. Mär 2015, 20:18

Hi, danke für den Tipp! :)

Also, ganz neuer Ansatz: Nix mehr Einbinden JavaScript zum Auslesen von EXIF-Daten, sondern Magnific Popup so umfriemeln, dass es per PHP diese Daten gleich selbt ausließt und ausgibt:

Im Original Ausgabe-Modul für Gallerien werden Titel und Beschreibung der Fotos, wie folgt, generiert bzw. aus dem Medienpool ausgelesen:

Code: Alles auswählen

	// make thumbs
	foreach ($images as $imageFile) {
		$media = OOMedia::getMediaByFilename($imageFile);

		// get title and description
		if (OOMedia::isValid($media)) {
			$title = $media->getValue('title');
			$description = $media->getValue('med_description');
		} else {
			$title = '';
			$description = '';
		}
Wie ich jetzt herausgefunden habe, stellt PHP ja selbst eine Anweisung zum Auslesen von EXIF-Daten zur Verfügung. Ich habe dementsprechend das Ausgabe-Modul, wie folgt, geändert:

Code: Alles auswählen

	// make thumbs
	foreach ($images as $imageFile) {

	// get title and description
	$exif = exif_read_data($imageFile, 0, true);
        $emake =$exif['Make'];
        $emodel = $exif['Model'];
        $eexposuretime = $exif['ExposureTime'];
        $efnumber = $exif['FNumber'];
        $eiso = $exif['ISOSpeedRatings'];
        $edate = $exif['DateTime'];

			$title = "Marke: ' .$emake. ' Modell: ' .$emodel. ' Verschlusszeit: ' .$eexposuretime. ' Blende: ' .$efnumber. ' ISO-Wert: ' .$eiso. ' Aufnahmedatum: ' .$edate. '";
			$description = "Marke: ' .$emake. ' Modell: ' .$emodel. ' Verschlusszeit: ' .$eexposuretime. ' Blende: ' .$efnumber. ' ISO-Wert: ' .$eiso. ' Aufnahmedatum: ' .$edate. '";
Leider werden die Werte nicht ausgelesen. :x Kann mir jemand sagen, wo der Fehler liegt :?: :!:

Benutzeravatar
RexDude
Beiträge: 2543
Registriert: 22. Apr 2010, 11:24

Re: EXIF Daten aus Fotos auslesen und ausgeben

12. Mär 2015, 20:29

Debuggen ist angesagt ;)
Schau mal was in $imageFile steht und ob exif_read_data() damit klarkommt.

Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

12. Mär 2015, 20:52

In $imageFile steht immer schön korrekt der Dateinahme der entsprechenden Datei...Syntax-Fehler bei exif_read_data() kann ich nicht erkennen...

siehe php.net :!: :roll:

Benutzeravatar
RexDude
Beiträge: 2543
Registriert: 22. Apr 2010, 11:24

Re: EXIF Daten aus Fotos auslesen und ausgeben

12. Mär 2015, 21:05

Ich meine da fehlt der Pfad davor.
Probier mal /files/ davor. Oder per seo42::getMediaFile($imageFile) oder noch besser seo42::getAbsoluteMediaFile($imageFile).

Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

13. Mär 2015, 02:04

Also mein Lieber, ich hab' das jetzt gelöst nach dem Motto "I did it my way...". :lol: Das Problem war zunächst mal, dass die Felder so in der Datei einfach nicht gefunden wurden. Dazu musste ich mich erstmal in die sog. EXIF-Spezifikationen (die sich zuletzt 2013 geändert haben) vertiefen. :x Genau das wollte ich eigentlich vorher umschiffen...naja... :roll: Also habe ich das Auslesen an sich jetzt anders umgesetzt.
Deinem Vorschlag, auf die Datei via seo42::get[Absolute]MediaFile($imageFile) zuzugreifen, bin ich nicht gefolgt, auch wenn Magnific Popup bereits mit der Klasse seo42 arbeitet. Ich habe es über "$REX['HTDOCS_PATH'] . $mediaDir . '/' . $imageFile" gelöst. Überlegung: Das erhält die Abwärtskompatibilität zu älteren REX-Versionen ohne seo42. Was hälst Du davon?
Code sieht jetzt so aus:

Code: Alles auswählen

       // make thumbs
       foreach ($images as $imageFile) {

       // get title and description
            $exif = exif_read_data($REX['HTDOCS_PATH'] . $mediaDir . '/' . $imageFile, 0, true);
			foreach ($exif as $key => $section) {
			foreach ($section as $name => $val) {
			$wert = "$key.$name";
		// Testweise alle vorhandenen EXIF-Datenfelder ausgebenlassen:
		// echo "$key.$name: $val<br />\n";
				if($wert == 'IFD0.ImageDescription')
					{
					$titel = "$val  ";
					}
				if($wert == 'WINXP.Subject')
					{
					$thema = "($val)  ";
					}
				if($wert == 'IFD0.Copyright')
					{
					$copyright = "von $val";
					}
				if($wert == 'IFD0.Make')
					{
					$marke = "  |  Kamera: $val";
					}
				if($wert == 'IFD0.Model')
					{
					$modell= "  |  Modell: $val";
					}
				if($wert == 'EXIF.ExposureTime')
					{
					$exposuretime = "  |  Verschlusszeit: $val";
					}
				if($wert == 'COMPUTED.ApertureFNumber')
					{
					$blende= "  |  Blende: $val";
					}
				if($wert == 'EXIF.ISOSpeedRatings')
					{
					$isowert= "  |  ISO: $val";
					}
				if($wert == 'EXIF.FocalLength')
					{
					$brennweite= "  |  Brennweite: $val mm";
					}					
			}
			}

             $title = $titel.$thema.$copyright.$marke.$modell.$exposuretime.$blende.$isowert.$brennweite;
             $description = $titel.$thema.$copyright.$marke.$modell.$exposuretime.$blende.$isowert.$brennweite;

		// generate image url
		$imageUrl = $REX['HTDOCS_PATH'] . $mediaDir . '/' . $imageFile;

		// generate image manager url
		if (class_exists('seo42')) {
			$imageManagerUrl = seo42::getImageManagerUrl($imageFile, $imageType);
		} else {
			if ($REX['REDAXO']) {
				$imageManagerUrl = $REX['HTDOCS_PATH'] . 'redaxo/index.php?rex_img_type=' . $imageType . '&rex_img_file=' . $imageFile;
			} else {
				$imageManagerUrl = $REX['HTDOCS_PATH'] . 'index.php?rex_img_type=' . $imageType . '&rex_img_file=' . $imageFile;
			}
		}

		// get dimensions of image manager image
		$resizedFile = $REX['INCLUDE_PATH'] . '/generated/files/image_manager__' . $imageType . '_' . $imageFile;
		$imageSize = @getimagesize($resizedFile);

		if ($imageSize != false) {
			$imageDimensions = ' width="' . $imageSize[0] . '" height="' . $imageSize[1] . '"';
		} else {
			$imageDimensions = '';
		}

		// html code
		echo '<a href="' . $imageUrl . '" title="' . $description . '">';
		echo '<img src="' . $imageManagerUrl . '"' . $imageDimensions . ' alt="' . $title . '" />';
		echo '</a>';

	unset($titel, $thema, $copyright, $marke, $modell, $exposuretime, $blende, $isowert, $brennweite);
	}
Es werden so auch immer nur die EXIF-Datenfelder eingelesen, die tatsächlich auch Informationen enthalten. Hier ein Beispiel.
Das wäre m.E. auch eine interessante Erweiterung für das Projekt github.com/olien/iptc. :wink:


Benutzeravatar
Oliver.Kreischer
Beiträge: 2508
Registriert: 17. Dez 2004, 00:03
Wohnort: Velbert - LA
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

13. Mär 2015, 09:27

karlnappmitdenasskap hat geschrieben:Das wäre m.E. auch eine interessante Erweiterung für das Projekt github.com/olien/iptc. :wink:
Coole Idee. Damals mussten die Infos einfach in den Medienpool um die überall zur Verfügung zu haben.
Ich würde mich freuen wenn jemand Interesse hat das zu erweitern.

LG
Oliver
> Friends Of REDAXO Gemeinsame REDAXO-Entwicklung!
> REDAXO Agenturen. Eintragen erwünscht!
> Komm in den Slack Channel Es lohnt sich!

Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

13. Mär 2015, 19:43

Danke, ja die Idee die EXIF-Daten "Beschreibung" u. "Autor" im Medienpool dezent anzeigen zu lassen, finde ich grds. sehr cool.
Allerdings hab ich in der "class.rex_iptc.inc.php" gar nicht richtig verstanden, wie Ihr die Infos aus der jeweiligen Datei auslest bzw. dann im Klappmenü ausgeben lasst. Bei mir wurden auch gar keine Informationen aus den Dateien angezeigt. Die Felder "iptc_author" und "iptc_description" sind immer leer geblieben.
Dementsprechend isses mir da leider nicht gelungen, meine Auslese-Variante (die wahrscheinlich ungleich weniger elegant ist... :lol: ) mal testweise reinzubasteln.

Ich habe das Ausgabe-Modul (Magnific Popup) jetzt nochmal so umgeschrieben, dass man, wenn man die EXIF-Daten-Auslesen-Funktion nutzen will, nur noch eine Variable austauschen muss. Wenn jemand Interesse daran hat:

Code: Alles auswählen

<?php
// module: magnific_popup_gallery_out

$imageType = 'magnific_popup_gallery_thumb';
$mediaList = 'REX_MEDIALIST[1]';

if ($mediaList != '') {
	echo '<div class="magnific-popup-gallery">';

	// get media dir
	if (isset($REX['MEDIA_DIR'])) {
		$mediaDir = $REX['MEDIA_DIR'];
	} else {
		$mediaDir =  'files';
	}

	// get list with all images
	$images = explode(',', $mediaList);

	// make thumbs
	foreach ($images as $imageFile) {
		$media = OOMedia::getMediaByFilename($imageFile);

		// get title and description
		if (OOMedia::isValid($media)) {
			$title = $media->getValue('title');
			$description = $media->getValue('med_description');
		} else {
			$title = '';
			$description = '';
		}

			// EXIF-Daten aus Datei auslesen		
		    $exif = exif_read_data($REX['HTDOCS_PATH'] . $mediaDir . '/' . $imageFile, 0, true);
			foreach ($exif as $key => $section) {
			foreach ($section as $name => $val) {
			$wert = "$key.$name";
		/*
		Alle vorhandenen Werte ausgeben lassen:
		echo "$key.$name: $val<br />\n";
		*/
				if($wert == 'IFD0.ImageDescription')
					{
					$titel = "$val  ";
					}
				if($wert == 'WINXP.Subject')
					{
					$thema = "($val)  ";
					}
				if($wert == 'IFD0.Copyright')
					{
					$copyright = "von $val";
					}
				if($wert == 'IFD0.Make')
					{
					$marke = "  |  Kamera: $val";
					}
				if($wert == 'IFD0.Model')
					{
					$modell= "  |  Modell: $val";
					}
				if($wert == 'EXIF.ExposureTime')
					{
					$exposuretime = "  |  Verschlusszeit: $val";
					}
				if($wert == 'COMPUTED.ApertureFNumber')
					{
					$blende= "  |  Blende: $val";
					}
				if($wert == 'EXIF.ISOSpeedRatings')
					{
					$isowert= "  |  ISO: $val";
					}
				if($wert == 'EXIF.FocalLength')
					{
					$brennweite= "  |  Brennweite: $val mm";
					}					
			}
			}

        $exifdaten = $titel.$thema.$copyright.$marke.$modell.$exposuretime.$blende.$isowert.$brennweite;

		// generate image url
		$imageUrl = $REX['HTDOCS_PATH'] . $mediaDir . '/' . $imageFile;

		// generate image manager url
		if (class_exists('seo42')) {
			$imageManagerUrl = seo42::getImageManagerUrl($imageFile, $imageType);
		} else {
			if ($REX['REDAXO']) {
				$imageManagerUrl = $REX['HTDOCS_PATH'] . 'redaxo/index.php?rex_img_type=' . $imageType . '&rex_img_file=' . $imageFile;
			} else {
				$imageManagerUrl = $REX['HTDOCS_PATH'] . 'index.php?rex_img_type=' . $imageType . '&rex_img_file=' . $imageFile;
			}
		}

		// get dimensions of image manager image
		$resizedFile = $REX['INCLUDE_PATH'] . '/generated/files/image_manager__' . $imageType . '_' . $imageFile;
		$imageSize = @getimagesize($resizedFile);

		if ($imageSize != false) {
			$imageDimensions = ' width="' . $imageSize[0] . '" height="' . $imageSize[1] . '"';
		} else {
			$imageDimensions = '';
		}

		/* html code
		$description gegen $exifdaten austauschen für EXIF-Daten als Beschreibung
		-> Die Beschreibung in der Großansicht wird aus 'title="..."' ausgelesen, nicht aus der Variable $description.
		*/
		echo '<a href="' . $imageUrl . '" title="' . $exifdaten . '">';
		echo '<img src="' . $imageManagerUrl . '"' . $imageDimensions . ' alt="' . $title . '" />';
		echo '</a>';

		// EXIF-Werte löschen, damit sie nicht für das nächste Bild übernommen werden.
		unset($titel, $thema, $copyright, $marke, $modell, $exposuretime, $blende, $isowert, $brennweite);	

	}			
			
	echo '<div class="clearer"></div>';
	echo '</div>';
}
?>
Interessant wäre ja auch, dass die Beschreibung in der Großansich aus dem Title (title) ausgegeben wird und darunter etwas kleiner - als Subtitel - die EXIF-Daten.
Allerdings weiss ich nicht, wie man in Magnific Popup unter die Beschreibung noch ne weitere Zeile reinbasteln kann, so wie hier in den Beispielen unter "Lightbox gallery"...

Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

Re: EXIF Daten aus Fotos auslesen und ausgeben

14. Mär 2015, 00:01

...und weil ich jetzt noch gemerkt hab, dass ich die ganze Zeit brav mit MP 1.2.0 gearbeitet habe, hier nochmal das Ausgabe-Modul für MP 1.3.1:

Code: Alles auswählen

<?php
// module: magnific_popup_gallery_out

$imageType = 'magnific_popup_gallery_thumb';
$mediaList = 'REX_MEDIALIST[1]';

if ($mediaList != '') {
	echo '<div class="magnific-popup-gallery">';

	// get media dir
	if (isset($REX['MEDIA_DIR'])) {
		$mediaDir = $REX['MEDIA_DIR'];
	} else {
		$mediaDir =  'files';
	}

	// get list with all images
	$images = explode(',', $mediaList);

	// make thumbs
	foreach ($images as $imageFile) {
		$media = OOMedia::getMediaByFilename($imageFile);

		// get title and description
		if (OOMedia::isValid($media)) {
			$title = $media->getValue('title');
			$description = $media->getValue('med_description');
		} else {
			$title = '';
			$description = '';
		}

			// EXIF-Daten aus Datei auslesen		
		    $exif = exif_read_data($REX['HTDOCS_PATH'] . $mediaDir . '/' . $imageFile, 0, true);
			foreach ($exif as $key => $section) {
			foreach ($section as $name => $val) {
			$wert = "$key.$name";
		/*
		Alle vorhandenen Werte ausgeben lassen:
		echo "$key.$name: $val<br />\n";
		*/
				if($wert == 'IFD0.ImageDescription')
					{
					$titel = "$val  ";
					}
				if($wert == 'WINXP.Subject')
					{
					$thema = "($val)  ";
					}
				if($wert == 'IFD0.Copyright')
					{
					$copyright = "von $val";
					}
				if($wert == 'IFD0.Make')
					{
					$marke = "  |  Kamera: $val";
					}
				if($wert == 'IFD0.Model')
					{
					$modell= "  |  Modell: $val";
					}
				if($wert == 'EXIF.ExposureTime')
					{
					$exposuretime = "  |  Verschlusszeit: $val";
					}
				if($wert == 'COMPUTED.ApertureFNumber')
					{
					$blende= "  |  Blende: $val";
					}
				if($wert == 'EXIF.ISOSpeedRatings')
					{
					$isowert= "  |  ISO: $val";
					}
				if($wert == 'EXIF.FocalLength')
					{
					$brennweite= "  |  Brennweite: $val mm";
					}					
			}
			}

        $exifdaten = $titel.$thema.$copyright.$marke.$modell.$exposuretime.$blende.$isowert.$brennweite;

		// generate image url
		$imageUrl = $REX['HTDOCS_PATH'] . $mediaDir . '/' . $imageFile;

		// generate image manager url
		if (method_exists('seo42', 'getImageManagerFile')) {
			$imageManagerUrl = seo42::getImageManagerFile($imageFile, $imageType);
		} elseif (method_exists('seo42', 'getImageManagerUrl')) { // compat
			$imageManagerUrl = seo42::getImageManagerUrl($imageFile, $imageType);
		} else {
			if ($REX['REDAXO']) {
				$imageManagerUrl = $REX['HTDOCS_PATH'] . 'redaxo/index.php?rex_img_type=' . $imageType . '&rex_img_file=' . $imageFile;
			} else {
				$imageManagerUrl = $REX['HTDOCS_PATH'] . 'index.php?rex_img_type=' . $imageType . '&rex_img_file=' . $imageFile;
			}
		}

		// get dimensions of image manager image
		$resizedFile = $REX['INCLUDE_PATH'] . '/generated/files/image_manager__' . $imageType . '_' . $imageFile;
		$imageSize = @getimagesize($resizedFile);

		if ($imageSize != false) {
			$imageDimensions = ' width="' . $imageSize[0] . '" height="' . $imageSize[1] . '"';
		} else {
			$imageDimensions = '';
		}

		/* html code
		$description gegen $exifdaten austauschen für EXIF-Daten als Beschreibung
		-> Die Beschreibung in der Großansicht wird aus 'title="..."' ausgelesen, nicht aus der Variable $description.
		*/
		echo '<a href="' . $imageUrl . '" title="' . $exifdaten . '">';
		echo '<img src="' . $imageManagerUrl . '"' . $imageDimensions . ' alt="' . $title . '" />';
		echo '</a>';

		// EXIF-Werte löschen, damit sie nicht für das nächste Bild übernommen werden.
		unset($titel, $thema, $copyright, $marke, $modell, $exposuretime, $blende, $isowert, $brennweite);

	}

	echo '<div class="clearer"></div>';
	echo '</div>';
}
?>

Zurück zu „Allgemeines [R4]“