Workshop: Photo Sphere erstellen

Ein Workshop wie man mit ExifTool die fehlenden XMP Metadaten (Extensible Metadata Platform) zu einem Panoramabild ergänzt um eine Photo Sphere zu erhalten.

Am Ende dieses Workshops wird ein Script erarbeitet, welches aus einem Panoramabild eine Photosphere erzeugt, die sich in Google Fotos, Facebook, Android, Apple iOS usw. dreht. Weiters werden Geokoordinaten und Copyright-Informationen zur Photosphere hinzugefügt, Anfangsansicht des Panoramaviewers eingestellt und Datum/Uhrzeit/Zeitzone, Farbraum und Punktdichte korrigiert.

Früher, als es noch keine 360°-Kameras gab, mußte man die Panoramen aus Einzelbildern mit einem Stitcher zusammensetzen. Damals gab es noch kein Google Street View. Google war erst am Anfang und Facebook gab es noch nicht, geschweige denn Android oder iPhone. Auf Webseiten waren Java-Viewer für Panoramabilder beliebt, sind aber mittlerweile aus der Mode gekommen nicht nur wegen der vielen und nie enden wollenden Sicherheitslücken von Java.

Heutzutage ist alles viel einfacher geworden, trotzdem existieren immer noch 360°-Panoramen in Archiven die keine XMP-Metadaten haben und sich deshalb in Facebook nicht drehen können.

Daher muß man die Metadaten manuell hinzufügen. Am einfachsten geschieht dies mit dem

ExifTool

Am besten von der ExifTool-Homepage downloaden, Pfad setzen, fertig. Hilfreich dazu ist noch die grafische Oberfläche, genannt ExifToolGUI, ist aber nicht unbedingt notwendig.

Equirektangularprojektion

Ist die Projektion einer Kugeloberfläche auf eine Ebene, also eine Grafikdatei im Format 2:1 bzw. 360° x 180°.

Equirektangularprojektion

Facebook, Android

Für ein Vollsphärenpanorama reicht der Parameter ProjectionType, dieser muß auf equirectangular gesetzt sein damit sich das Panorama in Facebook oder Android drehen kann.

exiftool -ProjectionType="equirectangular" input.jpg

Für Facebook werden Abmessungen von maximal 6000 x 3000 Pixel (18 Megapixel) empfohlen.

Panoramaviewer für Android ist zum Beispiel TurnMe Panorama.

Google Fotos

Bei einem Vollsphärenpanorama kommt zur Kommandozeile hinzu

-UsePanoramaViewer="True" '-CroppedAreaImageWidthPixels<$ImageWidth' '-CroppedAreaImageHeightPixels<$ImageHeight' '-FullPanoWidthPixels<$ImageWidth' '-FullPanoHeightPixels<$ImageHeight' -CroppedAreaLeftPixels="0" -CroppedAreaTopPixels="0"

Fotos dürfen nicht mehr als 75 MB und 100 Megapixel haben und dürfen nicht mehr als 32767 Pixel groß sein. Alles was darüber hinaus geht kann nicht in Google Fotos gespeichert werden.

Zenit und Nadir

Equirektangularprojektion ohne Zenit und Nadir
Bild © Wikipedia Schloß Hellbrunn

Meistens fehlt im Panorama Zenit und Nadir (also oben und unten abgeschnitten), speziell wenn beim Fotografieren kein Fischaugobjektiv verwendet wurde. Die Grafikdatei ist dann nicht mehr im Format 2:1, also keine vollständige Kugeloberfläche mehr. In diesem Fall müssen die Cropped-Parameter angepaßt werden.

Beschreibung der XMP-Parameter

Beispiel aus der Praxis

Ein Vollsphärenpanorama hätte die Abmessung 5376 x 2688. Da jedoch beim Fotografieren kein Fischaugobjektiv verwendet wurde fehlen Zenit und Nadir und die Grafikdatei hat nur mehr 5376 x 2048 Pixel, also 360° x 137° statt 360° x 180°.

Wie kann man das Panoramafoto zu einer Photosphere umwandeln?

Linux

Die vollständige Befehlskette lautet unter Linux:

exiftool -ProjectionType="equirectangular" -UsePanoramaViewer="True" '-CroppedAreaImageWidthPixels<$ImageWidth' '-CroppedAreaImageHeightPixels<$ImageHeight' '-FullPanoWidthPixels<$ImageWidth' '-FullPanoHeightPixels<${ImageWidth;$_/=2}' -CroppedAreaLeftPixels="0" '-CroppedAreaTopPixels<${Imagewidth;$_=($_/2-$self->GetValue("ImageHeight"))/2}' input.jpg

Windows

ExifTool ist Perl und deswegen verwenden Windows-Benutzer statt dem Zeichen ' das Zeichen " überall dort wo das Zeichen $ vorkommt, sodaß die Befehlskette lautet:

exiftool -ProjectionType="equirectangular" -UsePanoramaViewer="True" "-CroppedAreaImageWidthPixels<$ImageWidth" "-CroppedAreaImageHeightPixels<$ImageHeight" "-FullPanoWidthPixels<$ImageWidth" "-FullPanoHeightPixels<${ImageWidth;$_/=2}" -CroppedAreaLeftPixels="0" "-CroppedAreaTopPixels<${Imagewidth;$_=($_/2-$self->GetValue(\"ImageHeight\"))/2}" input.jpg

Kamerahersteller und -modell

Die Metadaten einer 360°-Kamera sind nicht unbedingt notwendig. Werden sie jedoch hinzugefügt und ist das Panorama eine vollständige Kugeloberfläche öffnet sich in Google Fotos automatisch die Panoramaansicht. Fehlen diese Metadaten, sieht man zunächst nur die flache Ansicht des Panoramas mit einem Symbol in der Mitte des Bildes zum Wechseln in die Panoramaansicht.

LG 360 CAM

-Make="LG Electronics" -Model="LG-R105"

Ricoh Theta S

-Make="RICOH" -Model="RICOH THETA S"

Google Maps

Soll die Photosphere in Google Maps angezeigt werden ist der Parameter PoseHeadingDegrees erforderlich, ansonsten kann er weggelassen werden. Des weiteren muß das Panorama eine volle Kugeloberfläche sein und Geokoordinaten enthalten. Die Grafikdatei muß also ein Seitenverhältnis von 2:1 haben (360° x 180°).

PoseHeadingDegrees gibt an wohin der Mittelpunkt des Bildes zeigt, ähnlich wie ein Kompass. Der Parameter wird in Grad gemessen und muß >=0° und < 360° sein.

-PoseHeadingDegrees="0"Mittelpunkt des Bildes zeigt nach Norden
-PoseHeadingDegrees="90"Mittelpunkt des Bildes zeigt nach Osten
-PoseHeadingDegrees="180"Mittelpunkt des Bildes zeigt nach Süden
-PoseHeadingDegrees="270"Mittelpunkt des Bildes zeigt nach Westen

Anfangsansicht

Werden diese Parameter nicht gesetzt, ist die Anfangsansicht im Panoramviewer die Bildmitte des Panoramas.

InitialViewHeadingDegrees

Ist die Orientierung der Anfangssicht in Grad.

-InitialViewHeadingDegrees="0"linker Rand des Bildes
-InitialViewHeadingDegrees="180"Bildmitte
-InitialViewHeadingDegrees="360"rechter Rand des Bildes

InitialViewPitchDegrees

Der Neigungswinkel der Anfangssicht in Grad.

-InitialViewPitchDegrees=”0″

InitialViewRollDegrees

Der Rollwinkel der Anfangssicht in Grad.

-InitialViewRollDegrees="0"

InitialHorizontalFOVDegrees

Gibt den horizontalen Bildwinkel in Grad an (FOV = Field Of View). Je kleiner der Bildwinkel, desto größer der Vergrößerungsfaktor.

-InitialHorizontalFOVDegrees="90"

Farbraum

Fehlt meistens bei den alten Archivbildern.

Einstellen auf sRGB (Standard RGB):

-ColorSpace="sRGB" -ColorMode="RGB"

Punktdichte

Wird in dpi angegeben (“dots per inch” oder “Punkte per Zoll”). Ist oft fälschlicherweise auf 72 dpi statt 300 dpi eingestellt oder die Parameter fehlen komplett.

Einstellen auf 300 dpi:

-XResolution="300" -YResolution="300"

Datum/Uhrzeit/Zeitzone

Das Datum wird im Format YYYY:MM:TT angegeben und die Uhrzeit im Format HH:MM:SS.

Die Zeitzone wird als Offset zur UTC (Coordinated Universal Time) angegeben.

-DateTimeOriginal="2001:12:31 12:00:00" -CreateDate="2001:12:31 12:00:00" -ModifyDate="2001:12:31 12:00:00" -OffsetTime="+07:00" -OffsetTimeOriginal="+07:00" -OffsetTimeDigitized="+07:00"

GPS Koordinaten

Um die Position auf der Weltkarte darstellen zu können, werden die geographische Breite und Länge in Dezimalgrad benötigt. Dieses Wertepaar erhält man am schnellsten von Google Earth.

In Google Earth in den Optionen aus dem Menü Tools zuerst die Breite/Länge auf Dezimalgrad einstellen

Google Earth - Tools-Menü
Google Earth Optionen: Dezimalgrad

Nun erscheinen in Google Earth beim Darüberfahren mit der Maus über einen Ort rechts unten in der Statuszeile die Breiten- und Längengrade in Dezimalgrad, die 1:1 in das Panorama übernommen werden können.

Breitengrad

Ist in ExifTool der Parameter GPSLatitude und GPSLatitudeRef.

Ist der Breitengrad positiv, liegt er nördlich des Äquators und GPSLatitudeRef ist entweder 1 oder N.

Ist der Breitengrad negativ, liegt er südlich des Äquators und GPSLatitudeRef ist entweder -1 oder S.

Längengrad

Ist in ExifTool der Parameter GPSLongitude und GPSLongitudeRef.

Ist der Längengrad positiv, liegt er östlich von Greenwich und GPSLongitudeRef ist entweder 1 oder E.

Ist der Längengrad negativ, liegt er westlich von Greenwich und GPSLongitudeRef ist entweder -1 oder W.

Beispiele

OrtExifTool-Parameter
Wien-GPSLatitude="48.208174" -GPSLatitudeRef="1" -GPSLongitude="16.373819" -GPSLongitudeRef="1"
San Francisco-GPSLatitude="37.774930" -GPSLatitudeRef="1" -GPSLongitude="-122.419416" -GPSLongitudeRef="-1"
Rio de Janiero-GPSLatitude="-22.906847" -GPSLatitudeRef="-1" -GPSLongitude="-43.172897" -GPSLongitudeRef="-1"
Sydney-GPSLatitude="-33.934709" -GPSLatitudeRef="-1" -GPSLongitude="151.215976" -GPSLongitudeRef="1"

Höhe über dem Meeresspiegel

Ist in ExifTool der Parameter GPSAltitude und GPSAltitudeRef.

Ist die Höhe über dem Meeresspiegel so ist GPSAltitudeRef=0, sonst ist GPSAltitudeRef=1.

Copyright

-CopyrightFlag="True" -Marked="True" -Creator="Gerald Allerstorfer" -Artist="Gerald Allerstorfer" -Author="Gerald Allerstorfer" -Rights="© Gerald Allerstorfer, all rights reserved"  -Copyright="© Gerald Allerstorfer, all rights reserved" -CopyrightNotice="© Gerald Allerstorfer, all rights reserved" -UsageTerms="© Gerald Allerstorfer, all rights reserved"

Universal-Script

zur manuellen Umwandlung eines Panoramafotos in eine Photosphere mit ExifTool.

Der komplette Workshop in einem Einzeiler.

exiftool -overwrite_original -CopyrightFlag="True" -Marked="True" -Creator="Gerald Allerstorfer" -Artist="Gerald Allerstorfer" -Author="Gerald Allerstorfer" -Rights="© Gerald Allerstorfer, all rights reserved" -Copyright="© Gerald Allerstorfer, all rights reserved" -CopyrightNotice="© Gerald Allerstorfer, all rights reserved" -UsageTerms="© Gerald Allerstorfer, all rights reserved" -DateTimeOriginal="2001:02:03 04:05:06" -CreateDate="2001:02:03 04:56:06" -ModifyDate="2001:02:03 04:05:06" -PoseHeadingDegrees="0" -PosePitchDegrees="0" -PoseRollDegrees="0" -InitialViewHeadingDegrees="180" -InitialViewPitchDegrees="0" -InitialViewRollDegrees="0" -InitialHorizontalFOVDegrees="60" -ColorSpace="sRGB" -ColorMode="RGB" -XResolution="300" -YResolution="300" -Make="RICOH" -Model="RICOH THETA S" -ProjectionType="equirectangular" -UsePanoramaViewer="True" '-CroppedAreaImageWidthPixels<$ImageWidth' '-CroppedAreaImageHeightPixels<$ImageHeight' '-FullPanoWidthPixels<$ImageWidth' '-FullPanoHeightPixels<${ImageWidth;$_/=2}' -CroppedAreaLeftPixels="0" '-CroppedAreaTopPixels<${Imagewidth;$_=($_/2-$self->GetValue("ImageHeight"))/2}' panoramafoto.jpg

Sollte das Zeichen © nicht richtig übernommen werden verwenden Sie statt dessen (C) oder rufen obige Kommandozeile in Linux anstatt Windows auf.

Siehe auch