Der hier beschriebene Panorama-Namensraum enthält Eigenschaften, die Informationen zur Erstellung und Wiedergabe von Panoramaansichten liefern (auch als Panoramen bezeichnet), z. B. erstellt mit der Photo Sphere-Funktion in der Kamera von Android 4.2. Die Metadaten müssen serialisiert und in ein Panorama eingebettet werden, wie durch den Adobe XMP -Standard beschrieben (siehe Referenzen am Ende dieser Seite).
Der Namespace-URI lautet http://ns.google.com/photos/1.0/panorama/
Metadaten-Eigenschaften
Im nachfolgenden Diagramm und der Tabelle sind die Panoramaeigenschaften aufgeführt. Entwickler, die diese Metadaten schreiben, müssen die weiter unten in diesem Dokument genannten Eulerwinkel-Konventionen beachten. Entwickler, die Panoramaansichten bearbeiten und anzeigen, müssen die Metadaten gemäß der Beschreibung weiter unten in diesem Dokument überprüfen und aktualisieren.
Name | Typ | Erforderlich | Standardwert (Anzeigeprogramm vorausgesetzt) |
Beschreibung der Eigenschaft | Bei Bearbeitung des Bilds erforderliche Aktion |
---|---|---|---|---|---|
GPano:UsePanoramaViewer | Boolescher Wert | Nein | True | Gibt an, ob dieses Bild in einem Panoramaanzeigeprogramm und nicht als normales flaches Abbild angezeigt werden soll. Dies kann basierend auf den Benutzervoreinstellungen oder durch die Zusammenfügungssoftware festgelegt werden. Von der Anwendung, die das Bild anzeigt oder erfasst, kann diese ggf. ignoriert werden. | Skalierung/Zuschnitt: Keine Änderung. Dieser Wert kann in einer Anwendung auf „False“ gesetzt werden, wenn das Feld oder die Ansicht unter einen bestimmten Wert sinkt. |
GPano:CaptureSoftware | Zeichenfolge | Nein | - | Wenn die Aufnahme mit einer Anwendung auf einem mobilen Gerät, z. B. einem Android-Smartphone, erfolgte, ist dies der Name der verwendeten Anwendung (z. B. “Photo Sphere”). Hier sollte kein Eintrag stehen, wenn die Ausgangsbilder manuell aufgenommen wurden, z. B. mit einer digitalen Spiegelreflexkamera auf einem Stativ. | - |
GPano:StitchingSoftware | Zeichenfolge | Nein | - | Die Software, die zur Erstellung des fertigen Panoramas verwendet wurde. Dieser Wert kann in einigen Fällen mit dem Wert für GPano:CaptureSoftware | übereinstimmen.- |
GPano:ProjectionType | Freie Textauswahl | Ja |
Equirektangular |
Die Art der in der Bilddatei verwendeten Projektion. Google-Produkte unterstützen derzeit den Wert „Equirektangular“. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:PoseHeadingDegrees | Reelle Zahl | Nein, aber der Wert ist für die Anzeige in Google Maps erforderlich | - | Kompassausrichtung, gemessen in Grad, für den Mittelpunkt des Bilds. Der Wert muss >= 0 und < 360 sein. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:PosePitchDegrees | Reelle Zahl | Nein | 0 | Neigungswinkel, gemessen in Grad, für den Mittelpunkt des Bilds. Der Wert muss >= -90 und <= 90 sein. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:PoseRollDegrees | Reelle Zahl | Nein | 0 | Roll-Wert des Bilds, gemessen in Grad, wobei 0 auf einer Ebene mit dem Horizont bedeutet. Der Wert muss > -180 und <= 180 sein. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:InitialViewHeadingDegrees | Ganzzahl | Nein | 0 | Die Orientierung der Anfangssicht in Grad. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:InitialViewPitchDegrees | Ganzzahl | Nein | 0 | Der Neigungswinkel der Anfangssicht in Grad. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:InitialViewRollDegrees | Ganzzahl | Nein | 0 | Der Rollwinkel der Anfangssicht in Grad. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:InitialHorizontalFOVDegrees | Reelle Zahl | Nein | - | Das anfängliche horizontale Sichtfeld, das durch das Anzeigeprogramm dargestellt werden soll (in Grad). Dieser Wert ähnelt einer Vergrößerungsstufe. | - |
GPano:FirstPhotoDate | Datum | Nein | - | Datum und Uhrzeit des ersten im Panorama erstellten Bilds. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:LastPhotoDate | Datum | Nein | - | Datum und Uhrzeit des letzten im Panorama erstellten Bild. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:SourcePhotosCount | Ganzzahl | Nein | - | Anzahl der zum Erstellen des Panoramas verwendeten Ausgangsbilder. | Skalierung/Zuschnitt: Keine Änderung. |
GPano:ExposureLockUsed | Boolescher Wert | Nein | - | Wenn einzelne Ausgangsfotos aufgenommen wurden, gibt der Wert an, ob die Belichtungskorrektur der Kamera gesperrt war. | - |
GPano:CroppedAreaImageWidthPixels | Ganzzahl | Ja | - | Die ursprüngliche Breite des Bilds in Pixel (entspricht der tatsächlichen Bildbreite nicht bearbeiteter Bilder). | Skalierung/Zuschnitt: Diese Eigenschaft muss aktualisiert werden, damit sie die neue Größe des Bilds wiedergibt. |
GPano:CroppedAreaImageHeightPixels | Ganzzahl | Ja | - | Die ursprüngliche Höhe des Bilds in Pixel (entspricht der tatsächlichen Bildhöhe nicht bearbeiteter Bilder). | Skalierung/Zuschnitt: Diese Eigenschaft muss aktualisiert werden, damit sie die neue Größe des Bilds wiedergibt. |
GPano:FullPanoWidthPixels | Ganzzahl | Ja | - | Ursprüngliche Gesamtbreite vor dem Zuschneiden des Bilds. Wenn nur ein Teilpanorama aufgenommen wurde, gibt dieser Wert die Breite an, die das gesamte Panorama gehabt hätte. | Zuschnitt: Keine Änderung. Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich. |
GPano:FullPanoHeightPixels | Ganzzahl | Ja | - | Ursprüngliche Gesamthöhe vor dem Zuschneiden des Bilds. Wenn nur ein Teilpanorama aufgenommen wurde, gibt dieser Wert die Höhe an, die das gesamte Panorama gehabt hätte. | Zuschnitt: Keine Änderung. Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich. |
GPano:CroppedAreaLeftPixels | Ganzzahl | Ja | - | Die Spalte, in der der linke Rand des Panoramabilds in voller Größe zugeschnitten wurde. | Zuschnitt: Wenn der linke Zuschnitt des Bilds geändert wird, muss dieser Wert aktualisiert werden. Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich. |
GPano:CroppedAreaTopPixels | Ganzzahl | Ja | - | Die Zeile, in der der obere Rand des Panoramabilds in voller Größe zugeschnitten wurde. | Zuschnitt: Wenn der obere Zuschnitt des Bilds geändert wird, muss dieser Wert aktualisiert werden. Skalierung: Eine entsprechende korrekte Skalierung ist erforderlich. |
GPano:InitialCameraDolly | Reelle Zahl | Nein | 0 | Dieser optionale Parameter verschiebt die Position der virtuellen Kamera entlang der Sichtlinie, weg vom Mittelpunkt Ihres Panoramas. Eine hintere Flächenposition wird durch den Wert -1,0 dargestellt, eine vordere Flächenposition durch den Wert 1,0. Für die normale Anzeige ist dieser Parameter auf den Wert 0 zu setzen. | - |
Beispiel eines vollständigen Panoramas
Wenn Sie kein Programmierer sind, können Sie das nachfolgende Metadatenbeispiel zu Ihrem vorhandenen vollständigen Panorama (360 Grad x 180 Grad) mit nur unwesentlichen Änderungen hinzufügen. Verwenden Sie dazu ein Bildbearbeitungsprogramm, z. B. Adobe Photoshop.
- Ändern Sie alle vorkommenden Werte 4000 und 2000 in die entsprechende Breite und Höhe Ihres Bilds in Pixeln.
- Aktualisieren Sie „PoseHeadingDegrees“, wenn Sie die Darstellung Ihres Panoramas in Google Maps ermöglichen möchten; anderenfalls können Sie diesen Parameter entfernen.
- Aktualisieren oder entfernen Sie optionale Parameter (wie oben aufgeführt).
<rdf:Description rdf:about="" xmlns:GPano="http://ns.google.com/photos/1.0/panorama/"> <GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer> <GPano:CaptureSoftware>Photo Sphere</GPano:CaptureSoftware> <GPano:StitchingSoftware>Photo Sphere</GPano:StitchingSoftware> <GPano:ProjectionType>equirectangular</GPano:ProjectionType> <GPano:PoseHeadingDegrees>350.0</GPano:PoseHeadingDegrees> <GPano:InitialViewHeadingDegrees>90.0</GPano:InitialViewHeadingDegrees> <GPano:InitialViewPitchDegrees>0.0</GPano:InitialViewPitchDegrees> <GPano:InitialViewRollDegrees>0.0</GPano:InitialViewRollDegrees> <GPano:InitialHorizontalFOVDegrees>75.0</GPano:InitialHorizontalFOVDegrees> <GPano:CroppedAreaLeftPixels>0</GPano:CroppedAreaLeftPixels> <GPano:CroppedAreaTopPixels>0</GPano:CroppedAreaTopPixels> <GPano:CroppedAreaImageWidthPixels>4000</GPano:CroppedAreaImageWidthPixels> <GPano:CroppedAreaImageHeightPixels>2000</GPano:CroppedAreaImageHeightPixels> <GPano:FullPanoWidthPixels>4000</GPano:FullPanoWidthPixels> <GPano:FullPanoHeightPixels>2000</GPano:FullPanoHeightPixels> <GPano:FirstPhotoDate>2012-11-07T21:03:13.465Z</GPano:FirstPhotoDate> <GPano:LastPhotoDate>2012-11-07T21:04:10.897Z</GPano:LastPhotoDate> <GPano:SourcePhotosCount>50</GPano:SourcePhotosCount> <GPano:ExposureLockUsed>False</GPano:ExposureLockUsed> </rdf:Description>
Beispiel einer Teilpanoramaansicht
<rdf:Description rdf:about="" xmlns:GPano="http://ns.google.com/photos/1.0/panorama/"> <GPano:UsePanoramaViewer>True</GPano:UsePanoramaViewer> <GPano:CaptureSoftware>Photo Sphere</GPano:CaptureSoftware> <GPano:StitchingSoftware>Photo Sphere</GPano:StitchingSoftware> <GPano:ProjectionType>equirectangular</GPano:ProjectionType> <GPano:PoseHeadingDegrees>350.0</GPano:PoseHeadingDegrees> <GPano:InitialViewHeadingDegrees>90.0</GPano:InitialViewHeadingDegrees> <GPano:InitialViewPitchDegrees>0.0</GPano:InitialViewPitchDegrees> <GPano:InitialViewRollDegrees>0.0</GPano:InitialViewRollDegrees> <GPano:InitialHorizontalFOVDegrees>75.0</GPano:InitialHorizontalFOVDegrees> <GPano:CroppedAreaLeftPixels>90</GPano:CroppedAreaLeftPixels> <GPano:CroppedAreaTopPixels>128</GPano:CroppedAreaTopPixels> <GPano:CroppedAreaImageWidthPixels>2300</GPano:CroppedAreaImageWidthPixels> <GPano:CroppedAreaImageHeightPixels>1042</GPano:CroppedAreaImageHeightPixels> <GPano:FullPanoWidthPixels>4000</GPano:FullPanoWidthPixels> <GPano:FullPanoHeightPixels>2000</GPano:FullPanoHeightPixels> <GPano:FirstPhotoDate>2012-11-07T21:03:13.465Z</GPano:FirstPhotoDate> <GPano:LastPhotoDate>2012-11-07T21:04:10.897Z</GPano:LastPhotoDate> <GPano:SourcePhotosCount>50</GPano:SourcePhotosCount> <GPano:ExposureLockUsed>False</GPano:ExposureLockUsed> </rdf:Description>
Robustheit bei der Bildbearbeitung
Um Robustheit sicherzustellen, müssen Programme, die Panoramen mit einem Anzeigeprogramm anzeigen, überprüfen, ob die ursprüngliche Panoramaansicht durch eine Anwendung aktualisiert wurde, ohne die Metadaten zu aktualisieren. Führen Sie dazu folgende Schritte aus:
- Stellen Sie sicher, dass der Tag „CroppedAreaImageWidthPixels“ mit der tatsächlichen Bildbreite übereinstimmt.
- Stellen Sie sicher, dass der Tag „CroppedAreaImageHeightPixels“ mit der tatsächlichen Bildhöhe übereinstimmt.
- Wenn Schritt 1 oder 2 nicht erfolgreich ist, überprüfen Sie, ob das Seitenverhältnis des Bild beibehalten wurde
- Wenn Schritt 3 nicht erfolgreich ist, zeigen Sie das Bild nicht als Panorama an, da es auf inkompatible Weise umgewandelt wurde und ein Aufrufen zu starken Verzerrungen führen würde.
- Ist Schritt 3 erfolgreich, wurde das Seitenverhältnis beibehalten, und alle folgenden zugehörigen Tag-Werte sollten so skaliert werden, dass sie zur neuen Bildgröße passen:
CroppedAreaImageWidthPixels, CroppedAreaImageHeightPixels, FullPanoWidthPixels, FullPanoHeightPixels, CroppedAreaLeftPixels, CroppedAreaRightPixels.
Übersicht über die Eulerwinkel
Die Ausrichtung des Panoramas im Weltrahmen wird durch Eulerwinkel definiert. Es gibt viele Möglichkeiten, um Eulerwinkel zu definieren. Für eine korrekte Ausrichtung muss ein Programm die hier beschriebenen Eulerwinkel-Konventionen genau befolgen.
Die Position oberhalb der Erdoberfläche definiert einen festen "lokalen Rahmen" XYZ. Hierbei bedeutet Z oben und rechtwinklig zur Erdoberfläche, X ist der geografische Osten, und Y ist der geografische Norden. Die Ausrichtung ist relativ zu diesem festen "lokalen Rahmen" definiert, und die Eulerwinkel bezeichnen Drehungen um diese festen XYZ-Achsen. Die Positionsausrichtung ist daher an den Polen nicht definiert. Das bedeutet, dass ein Panorama mit den Winkeln (0, 0, 0) so ausgerichtet ist, dass der zentrale Pixel zum geografischen Norden weist und der Äquator des Panoramas parallel zur Erdoberfläche verläuft.
Die Eulerwinkel sorgen für eine Zuordnung von Punkten im (rotierten) "Panoramarahmen
" zu Punkten im (festen) "lokalen Rahmen":
Eine Rotationsmatrix wird wie folgt aus den Eulerwinkeln
konstruiert (diese Reihenfolge ist unbedingt einzuhalten):
R = R_Z(-heading) * R_X(pitch) * R_Y(roll)
Hierbei gilt: R_*(t) eine Rotation nach rechts um die genannte Achse ist:
R_Z(angle) = [ cos(angle), -sin(angle), 0
sin(angle), cos(angle), 0
0, 0, 1 ]
R_X(angle) = [ 1, 0, 0,
0, cos(angle), -sin(angle),
0, sin(angle), cos(angle) ]
R_Y(angle) = [ cos(angle), 0, sin(angle),
0, 1, 0,
-sin(angle), 0, cos(angle) ]
and where: Z =Wobei gilt: Z = oben, X = Osten, Y = Norden.
Diese Reihenfolge ist unbedingt einzuhalten:
R = R_Z(-heading) * R_X(pitch) * R_Y(roll)
da Rotationen nicht kommutativ sind.
Beachten Sie, dass die Orientierung mit der Standardkompassausrichtung übereinstimmt.
Referenzen
Adobe XMP standard: http://www.adobe.com/devnet/xmp.html