Suche
Suche Menü

Smarty: Exif-Daten von Bildern auslesen und anzeigen

Will man zu einer Gallery Detaildaten zu den Bilder wie Auflösung, Brennweite und Belichtungsdauer bis hin zu den GPS-Koordinaten uvm. anzeigen, so kann dies mit der PHP Funktion exif_read_data() umgesetzt werden. Diese Funktion liest sämtliche vorhandenen Exif-Daten eines Bildes aus und liefert sie in einem Array zurück. Die Exif-Daten sind die Meta-Daten der Bilder.

In CMS Made Simple wird dies wie folgt eingebaut

{$exif = exif_read_data({$ipath}, 'IFD0')}

Hinter $ipath verbirgt sich der Systempfad des Bildes, NICHT die URL. Wie eine URL in den Systempfad konvertiert werden kann, ist hier beschrieben: https://www.cmsmadesimple.de/forum/view … hp?id=4963

Vor dem praktischen Einsatz solltet ihr allerdings eure Bilder prüfen, welche EXIF-Daten vorhanden sind. Diese sind zwar grundsätzlich standardisiert, aber da hat jeder Kamera-Hersteller so seine eigenen Vorstellungen, was geschrieben wird.

Funktioniert in CMSMS so (nach vorstehendem Befehl einfügen)

<pre>{$exif|print_r}</pre>

Der Output sieht in menem Fall so aus:

Array
(
    [FileName] => _DSC7200.JPG
    [FileDateTime] => 1466331900
    [FileSize] => 9866716
    [FileType] => 2
    [MimeType] => image/jpeg
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, GPS, INTEROP
    [COMPUTED] => Array
        (
            [html] => width="4288" height="2848"
            [Height] => 2848
            [Width] => 4288
            [IsColor] => 1
            [ByteOrderMotorola] => 1
            [ApertureFNumber] => f/11.0
            [UserComment] => Copyright by Lukas Blatter
            [UserCommentEncoding] => ASCII
            [Copyright] => Lukas BIatter                                         
            [Thumbnail.FileType] => 2
            [Thumbnail.MimeType] => image/jpeg
        )

    [Make] => NIKON CORPORATION
    [Model] => NIKON D300
    [Orientation] => 1
    [XResolution] => 300/1
    [YResolution] => 300/1
    [ResolutionUnit] => 2
    [Software] => Ver.1.10 
    [DateTime] => 2016:06:19 11:24:58
    [Artist] => Lukas Blatter                       
    [WhitePoint] => Array
        (
            [0] => 313/1000
            [1] => 329/1000
        )

    [PrimaryChromaticities] => Array
        (
            [0] => 64/100
            [1] => 33/100
            [2] => 21/100
            [3] => 71/100
            [4] => 15/100
            [5] => 6/100
        )

    [YCbCrCoefficients] => Array
        (
            [0] => 299/1000
            [1] => 587/1000
            [2] => 114/1000
        )

    [YCbCrPositioning] => 2
    [Copyright] => Lukas BIatter                                         
    [Exif_IFD_Pointer] => 472
    [GPS_IFD_Pointer] => 33888
    [THUMBNAIL] => Array
        (
            [Compression] => 6
            [XResolution] => 300/1
            [YResolution] => 300/1
            [ResolutionUnit] => 2
            [JPEGInterchangeFormat] => 34016
            [JPEGInterchangeFormatLength] => 8742
            [YCbCrPositioning] => 2
        )

    [ExposureTime] => 10/5000
    [FNumber] => 110/10
    [ExposureProgram] => 2
    [ISOSpeedRatings] => 1000
    [ExifVersion] => 0221
    [DateTimeOriginal] => 2016:06:19 11:24:58
    [DateTimeDigitized] => 2016:06:19 11:24:58
    [CompressedBitsPerPixel] => 4/1
    [ExposureBiasValue] => 0/6
    [MaxApertureValue] => 36/10
    [MeteringMode] => 5
    [LightSource] => 0
    [Flash] => 0
    [FocalLength] => 180/10
    [MakerNote] => Nikon
    [SubSecTime] => 08
    [SubSecTimeOriginal] => 08
    [SubSecTimeDigitized] => 08
    [FlashPixVersion] => 0100
    [ColorSpace] => 65535
    [ExifImageWidth] => 4288
    [ExifImageLength] => 2848
    [InteroperabilityOffset] => 33858
    [SensingMethod] => 2
    [CustomRendered] => 0
    [ExposureMode] => 0
    [WhiteBalance] => 0
    [DigitalZoomRatio] => 1/1
    [FocalLengthIn35mmFilm] => 27
    [SceneCaptureType] => 0
    [GainControl] => 2
    [Contrast] => 0
    [Saturation] => 0
    [Sharpness] => 0
    [SubjectDistanceRange] => 0
    [UndefinedTag:0xA500] => 22/10
    [InterOperabilityIndex] => R03
    [InterOperabilityVersion] => 0100
)

Praktisch an dieser Ausgabe, dass man bereits hier erkennen kann, wie man die Elemente des generierten $exif Arrays zur Anzeige bringt. So findet sich z.Bsp. für das Kamera-Modell dieser Eintrag

[Model] => Nikon D300

Angezeigt werden kann dies mit

{$exif.Model}

Manche Werte wie zum Beispiel der Zeitstempel oder die Dateigröße liegen aber als unformatierte Rohdaten vor, weshalb sie für die Anzeige noch etwas überarbeitet werden müssen.

[FileDateTime] => 1419676580
    [FileSize] => 237278

Der Zeitstempel ist ein Unix Zeitstempel und kann so über den in CMSMS mitgelieferten Modifikator cms_date_format formatiert werden.

{$exif.FileDateTime|cms_date_format:'%d. %B %Y'}

Um die Bytezahl der Dateigrösse in ein lesbares Format zu bringen, kann folgender Modifier (modifier.formatsize.php) genutzt werden

https://www.cmsmadesimple.de/forum/view … hp?id=4770

{$exif.FileSize|formatsize}

Zusammengefasst in einem erweiterungsfähigen Basis-Script sieht das dann so aus

{$ipath = "{$smarty.server.DOCUMENT_ROOT}{$iurl|parse_url:$smarty.const.PHP_URL_PATH}"}
{$exif = exif_read_data({$ipath}, 'IFD0')}
Erstellt: {$exif.FileDateTime|cms_date_format:'%d. %B %Y'}
Auflösung: {$exif.COMPUTED.Width} x {$exif.COMPUTED.Height}
Dateigröße: {$exif.FileSize|formatsize}
Kamera: {$exif.Make} {$exif.Model}

Ausgegeben wird folgendes

Erstellt: 19. Juni 2016
Auflösung: 4288 x 2848 Pixel
Dateigröße: 9.6MB
Kamera: Nikon D300

Ergänzen könnte man das Script um eine Prüfung, ob die EXIF Erweiterung aktuell auf eurem Host bzw. Server geladen ist. Dies lässt sich über eine Prüfung der Existenz der genutzten Funktion erledigen

{if function_exists('exif_read_data')}
...
{/if}

Zudem sollte man bei kritischen EXIF-Daten (also Daten, die nicht in jedem Bild vorhanden sind), vorher dessen Existenz prüfen

{if $exif.Make && $exif.Model}
  <p>Kamera: {$exif.Make} {$exif.Model}</p>
{/if}

Das komplette Script sähe in diesem Fall so aus

{if function_exists('exif_read_data')}
  {$ipath = "{$smarty.server.DOCUMENT_ROOT}{$iurl|parse_url:$smarty.const.PHP_URL_PATH}"}
  {$exif = exif_read_data({$ipath}, 'IFD0')}
  <p>Erstellt: {$exif.FileDateTime|cms_date_format:'%d. %B %Y'}</p>
  <p>Auflösung: {$exif.COMPUTED.Width} x {$exif.COMPUTED.Height}</p>
  <p>Dateigröße: {$exif.FileSize|formatsize}</p>
  {if $exif.Make && $exif.Model}
    <p>Kamera: {$exif.Make} {$exif.Model}</p>
  {/if}
{/if}

Falls das Script an mehreren Stellen eingesetzt werden soll, bietet sich natürlich auch der Einsatz dieses Tricks an

https://www.cmsmadesimple.de/forum/viewtopic.php?id=572

So muss der Block nicht jedes Mal neu eingefügt werden. Anpassungen können so auch an zentraler Stelle vorgenommen werden.

1. Falls nicht vorhanden, Verzeichnis /tmp/templates anlegen
2. Snippet in einer Datei als exif.tpl speichern
3. exif.tpl nach /tmp/templates hochladen
4. Aufruf an den gewünschten Stellen mittels

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.