Code, PHP, Webküche

EXIF-Daten mit PHP aus Bildern auslesen

Exif
Die digitale Welt greift weiter um sich. Dabei spielt die digitale Photographie eine große Rolle und immer mehr Nutzer präsentieren ihre Bilder im Netz. Für diese Form gibt es eine ganze Reihe von Lösungen. Immer mehr Software und Kameras unterstützen das EXIF-Format und schreiben eine ganze Reihe von Information in die Bilder.

Nur die wenigsten Möglichkeiten unterstützen das Auslesen und Darstellen der EXIF-Header Daten eines Bildes. Aber gerade beim Präsentieren von Bildern sind diese Information oft sinnvoll und nützlich, ob für die eigenen Zwecke oder um dem geneigten Lesern die Einstellungen der Kamera nahe zu legen und damit eventuell ähnliche Ergebnisse zu erreichen. Verwendung findet diese Funktion im PhotoBlog-Theme, welches ich auch selbst nutze.

PHP stellt seit Version 4.2.0 eine eigene Funktion bereit, die die EXIF-header-Daten auslesen kann. Ich habe die Möglichkeit genutzt und in eine eigene Funktion implementiert. Die Werte der Funktion exif_read_data werden in einem Array abgelegt und entsprechen nicht den üblichen Leseformen von Photographieinteressenten. Dazu muss ein wenig mehr machen. Einziger Nachteil, die Funktion kann lediglich JPG und TIFF auslesen. Will man das im Vorfeld sicher stellen, dann hilft die Funktion exif_imagetype.

Damit man das Rad nicht immer neu erfinden muss, kann die folgende Funktion gerne genutzt werden. Die Funktion liest nicht alle Werte aus – es gibt recht viele, und nicht alle hielt ich für relevant. Damit man aber mal einen Überblick über alle Inhalte bekommen kann, ist der folgende Syntax hilfreich.


$image = '/pfad/bild.jpg';
$exif = exif_read_data($image, 0 , true);

foreach ($exif as $key => $section) {
	foreach ($section as $name => $val) {
		echo "$key.$name: $val
\n"; } }

function fb_read_write_exif_data($post_ID) {

	$image = '/pfad/bild.jpg';
	
	if ($image != '') {
		error_reporting(0);
		
		$exif = exif_read_data($image, 0 , true);
		
		if(isset($exif["EXIF"]["DateTimeOriginal"])) {
			$fbdateoriginal = str_replace(":","-",substr($exif["EXIF"]["DateTimeOriginal"], 0, 10));
			$fbtimeoriginal = substr($exif["EXIF"]["DateTimeOriginal"], 10);
			print __('Datum:', 'photoblogfb') . " {$fbdateoriginal}";
			print __(' · Uhrzeit:', 'photoblogfb') . " {$fbtimeoriginal}";
			print "
\n"; } if(isset($exif["EXIF"]["FNumber"])) { list($num, $den) = explode("/",$exif["EXIF"]["FNumber"]); $fbaperture = "F/" . ($num/$den); print __('Blende:', 'photoblogfb') . " {$fbaperture}";; } if(isset($exif["EXIF"]["ExposureTime"])) { list($num, $den) = explode("/", $exif["EXIF"]["ExposureTime"]); if ($num > $den) { $fbexposure = "{$num}s"; print __(' · Belichtungsdauer:', 'photoblogfb') . " {$fbexposure}"; } else { $den = round($den/$num); $fbexposure = "1/{$den}s"; print __(' · Belichtungsdauer:', 'photoblogfb') . " {$fbexposure}"; } } if(isset($exif["EXIF"]["FocalLength"])) { list($num, $den) = explode("/", $exif["EXIF"]["FocalLength"]); $fbfocallength = ($num/$den) . "mm"; print __(' · Brennweite:', 'photoblogfb') . " {$fbfocallength}"; } if(isset($exif["EXIF"]["FocalLengthIn35mmFilm"])) { $fbfbfocallength35 = $exif["EXIF"]["FocalLengthIn35mmFilm"]; print __(', (KB-Format entsprechend:', 'photoblogfb') . " {$fbfbfocallength35}" . __('mm)'); } print "
\n"; if ( isset($exif["EXIF"]["ISOSpeedRatings"]) ) { print __('ISO:', 'photoblogfb') . " {$exif["EXIF"]["ISOSpeedRatings"]}"; } if (isset($exif["EXIF"]["WhiteBalance"]) ) { switch($exif["EXIF"]["WhiteBalance"]) { case 0: $fbwhitebalance = "Auto"; break; case 1: $fbwhitebalance = "Daylight"; break; case 2: $fbwhitebalance = "Fluorescent"; break; case 3: $fbwhitebalance = "Incandescent"; break; case 4: $fbwhitebalance = "Flash"; break; case 9: $fbwhitebalance = "Fine Weather"; break; case 10: $fbwhitebalance = "Cloudy"; break; case 11: $fbwhitebalance = "Shade"; break; default: $fbwhitebalance = ''; break; } print __(' · Weißabgleich:', 'photoblogfb') . " {$fbwhitebalance}"; } if (isset($exif["EXIF"]["Flash"]) ) { switch($exif["EXIF"]["Flash"]) { case 0: $fbexif_flash = 'Flash did not fire'; break; case 1: $fbexif_flash = 'Flash fired'; break; case 5: $fbexif_flash = 'Strobe return light not detected'; break; case 7: $fbexif_flash = 'Strobe return light detected'; break; case 9: $fbexif_flash = 'Flash fired, compulsory flash mode'; break; case 13: $fbexif_flash = 'Flash fired, compulsory flash mode, return light not detected'; break; case 15: $fbexif_flash = 'Flash fired, compulsory flash mode, return light detected'; break; case 16: $fbexif_flash = 'Flash did not fire, compulsory flash mode'; break; case 24: $fbexif_flash = 'Flash did not fire, auto mode'; break; case 25: $fbexif_flash = 'Flash fired, auto mode'; break; case 29: $fbexif_flash = 'Flash fired, auto mode, return light not detected'; break; case 31: $fbexif_flash = 'Flash fired, auto mode, return light detected'; break; case 32: $fbexif_flash = 'No flash function'; break; case 65: $fbexif_flash = 'Flash fired, red-eye reduction mode'; break; case 69: $fbexif_flash = 'Flash fired, red-eye reduction mode, return light not detected'; break; case 71: $fbexif_flash = 'Flash fired, red-eye reduction mode, return light detected'; break; case 73: $fbexif_flash = 'Flash fired, compulsory flash mode, red-eye reduction mode'; break; case 77: $fbexif_flash = 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected'; break; case 79: $fbexif_flash = 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected'; break; case 89: $fbexif_flash = 'Flash fired, auto mode, red-eye reduction mode'; break; case 93: $fbexif_flash = 'Flash fired, auto mode, return light not detected, red-eye reduction mode'; break; case 95: $fbexif_flash = 'Flash fired, auto mode, return light detected, red-eye reduction mode'; break; default: $fbexif_flash = ''; break; } print __(' · Blitz:', 'photoblogfb') . " {$fbexif_flash}"; } /** if(isset($exif["EXIF"]["Flash"])) { $fbflash = (bindec($exif["EXIF"]["Flash"]) ? "On" : "Off"); print __(' · Blitz:', 'photoblogfb') . " {$fbflash}"; } */ print "
\n"; if(isset($exif["IFD0"]["Make"]) && isset($exif["IFD0"]["Model"])) { $fbmake = ucwords(strtolower($exif["IFD0"]["Make"])); $fbmodel = ucwords($exif["IFD0"]["Model"]); print __('Kamera o. DIA-Scanner:', 'photoblogfb') . " {$fbmake}"; print __(',', 'photoblogfb') . " {$fbmodel}"; } /* Alle EXIF-Daten untereinander ausgeben */ /** foreach ($exif as $key => $section) { foreach ($section as $name => $val) { echo "$key.$name: $val
\n"; } } */ } }
Standard
Allgemein

bueltge.de [by:ltge.de] | Photographie geht online

Die ersten Bilder sind online und das Theme ist im großen und ganzen auch fertig – wer sich also für Bilder von mir interessiert, dem sei die neue Adresse

https://bueltge.de/photos/

empfohlen. Anregungen und Kritik, natürlich auch Lob, kann gern hier im Blog abgegeben werden. Der Photographie-Blog soll nur der Präsentation dienen. Viel Spass mit den Bildern.

Wie das ganze entstanden ist und Löungen kommen eventuell hier im Blog.

Standard
Allgemein, Webküche, WordPress

Allg – Wettbewerb Weblog-Kopfgestaltung

ein freidenker & eine muse veranstalten auf ihrem Blog einen Wettstreit – Wer hat die coolste Weblog-„Kopfgestaltung“ und dazu wurde ich eingeladen.
Warum nicht, dachte ich mir und habe zugesagt, obwohl mein Headerbild per Zufall geladen wird, aus einer kleinen Bibliothek schöner Erinnerungen.
Nun liegt es an den Besuchern des Blogs, wie die einzelnen Blogs mit ihren Headern abschneiden, den man kann abstimmen.
Ich hoffe natürlich ihr stimmt alle für mich, und das geht hier. 😉

Standard
Tipps, WordPress

WP – Image für den RSS Feed

Im folgenden Artikel erkläre ich kurz, wie man die ausgegebenen RSS Feed von WordPress ein wenig aufpeppen kann, in dem man die Funktion vieler RSS Reader unterstützt und ein Icon als Erkennungsmerkmal hinterlegt, ähnlich dem Favicon im Browser.

Demo:

Das ganze könnt ihr anhand des Screenshot meines Readers RSS Bandit sehen.

Screenshot RSS Bandit mit Image des Feeds

Um das ganze auch in jedem anderen Feed von WordPress zu realisieren, müssen einige Dateien eures Blogs verändert werden.
Alle Dateien findet ihr im Root-Verzeichnis eures Blogs. Dort sollte auch euer Icon für den RSS Feed liegen.

Achtung:

Sicherheitskopien sind im Vorfeld anzufertigen !

  • wp-rss2.php, ab Zeile 30 einfügen,
    nach <language?><?php echo get_option('rss_language'); ?></language?>
  • wp-rss.php, ab Zeile 24,
    nach <language?><?php echo get_option('rss_language'); ?></language?>
  • wp-commentsrss2.php, ab Zeile 28,
    nach <generator?>http://wordpress.org/?v=<?php echo $wp_version ?></generator?>

Folgender Code muss bei den genannten Datein hinzugefügt werden. Achtet darauf, dass ihr den Pfad zu eurem Icon richtig angebt. Um den Feed valide zu halten, kann nur png, gif oder jpg als Format für das Bild genutzt werden.


<image>
	<url><?php bloginfo_rss('url') ?>/icon_name.png</url>
	<title><?php bloginfo_rss('name') ?></title>
	<link><?php bloginfo_rss('url') ?></link>
</image>

Infos:
Der Image-Block im Feed ist optional und sorgt nur für optische Hervorhebung im RSS-Reader. Das Markup url beinhaltet den Link zum Icon. Der title– Tag ist für einen Alternativ-Attribut und der link– Tag verweist in der Regel auf die Website. Weiterhin können width und height für die Größe des Icons angegeben werden.

Weiterführende Links:

Die Integration eines Icons in den Feed ist jetzt auch per Plugin möglich, O.A.Schmitz hat ein kleines Plugin geschrieben – Feed-Image

Standard
Tipps, WordPress

WP – Headerbild verlinken

Im Allgemeinen gehört es zum guten Ton einer Website, wenn das Bild im Header auf die Startseite der Internet-Präsentation verlinkt. Da dies bei WordPress standardmäßig nicht so ist, sollte man folgenden Code in die header.php einfließen lassen.


onclick="location.href='http://www.website.domain/';" 
 onkeypress="location.href='http://www.website.domain/';" style="cursor: pointer;"

Update:
Von webdesign-in wurde ich darauf hingewiesen, wie man diese Erhöhung der Benutzerfreundlichkeit für alle Webuser brauchbar macht. Im Artikel ist ersichtlich, dass onclick und onkeypress zusammen gehören. Da ich barrierefreie Websiten natürlich für sinnvoll erachte, habe ich eine Codeänderung vorgenommen. Jetzt sollte der Code barrierearm/-frei sein.

Das ist schnell erledigt und erhöht so das Usability der Seite. Das ganze kann man lokal durchführen, oder aber in der Admin-Oberfläche deines WP unter –> Themes –> Theme-Editor –> Header Template.

suche nach:


<div id="header">
 <div id="headerimg" >
  <h1><a href="<?php echo get_settings('home'); ?>"><?php bloginfo('name'); ?></a></h1>
  <div class="description"><?php bloginfo('description'); ?></div>
 </div>
</div>

ändere in:


<div id="header">
 <div id="headerimg" onclick="location.href='<?php bloginfo('url'); ?>';" 
onkeypress="location.href='<?php bloginfo('url'); ?>';" style="cursor: pointer;">
  <h1><a href="<?php echo get_settings('home'); ?>" title="<?php bloginfo('name'); ?>">
<?php bloginfo('name'); ?></a></h1>
  <div class="description"><?php bloginfo('description'); ?></div>
 </div>
</div>
Standard
Allgemein

Allg – Nur mal so

Das besagte Bild
Bild: Conny

Ein wenig stolz bin ich schon.
Nach der Geburt unserer Tochter Nima haben wir, wie sicher viele stolze Eltern, unmengen Bilder (DIAs) von unserem Nachwuchs geschossen. Bilder, die mir besonders gefallen lege ich schon immer bei Pixelquelle.de ab. Und nun, wird doch ein Bild aus meiner Sammlung bei N-TV.de genutzt – sehr schön, es scheint also zu gefallen.
Herzlichen Dank auf diesem Wege mal an alle, die mir liebe Kommentare bei Pixelquelle hinterlassen haben.

Standard