Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird erläutert, wie Sie Bildmetadateneigenschaften lesen und schreiben und wie Sie Dateien mithilfe der Hilfsklasse GeotagHelper mit Geotags versehen.
Bildeigenschaften
Die StorageFile.Properties-Eigenschaft gibt ein StorageItemContentProperties-Objekt zurück, das Zugriff auf inhaltsbezogene Informationen zur Datei bietet. Rufen Sie die bildspezifischen Eigenschaften ab, indem Sie GetImagePropertiesAsync aufrufen. Das zurückgegebene ImageProperties-Objekt macht Elemente verfügbar, die grundlegende Bildmetadatenfelder enthalten, z. B. den Titel des Bilds und das Aufnahmedatum.
private async void GetImageProperties(StorageFile imageFile)
{
ImageProperties props = await imageFile.Properties.GetImagePropertiesAsync();
string title = props.Title;
if (title == null)
{
// Format does not support, or image does not contain Title property
}
DateTimeOffset dateTaken = props.DateTaken;
}
Um auf einen größeren Satz von Dateimetadaten zuzugreifen, verwenden Sie das Windows Eigenschaftensystem, eine Reihe von Dateimetadateneigenschaften, die mit einem eindeutigen Zeichenfolgenbezeichner abgerufen werden können. Erstellen Sie eine Liste mit Zeichenfolgen, und fügen Sie den Bezeichner für jede Eigenschaft hinzu, die Sie abrufen möchten. Die ImageProperties.RetrievePropertiesAsync-Methode verwendet diese Liste von Zeichenfolgen und gibt ein Wörterbuch mit Schlüssel-Wert-Paaren zurück, wobei der Schlüssel der Eigenschaftsbezeichner ist und der Wert der Eigenschaftswert ist.
private async void GetWindowsProperties(StorageFile imageFile)
{
ImageProperties props = await imageFile.Properties.GetImagePropertiesAsync();
var requests = new System.Collections.Generic.List<string>();
requests.Add("System.Photo.Orientation");
requests.Add("System.Photo.Aperture");
IDictionary<string, object> retrievedProps = await props.RetrievePropertiesAsync(requests);
ushort orientation;
if (retrievedProps.ContainsKey("System.Photo.Orientation"))
{
orientation = (ushort)retrievedProps["System.Photo.Orientation"];
}
double aperture;
if (retrievedProps.ContainsKey("System.Photo.Aperture"))
{
aperture = (double)retrievedProps["System.Photo.Aperture"];
}
}
Eine vollständige Liste der Windows Eigenschaften, einschließlich der Bezeichner und des Typs für jede Eigenschaft, finden Sie unter Windows Properties.
Einige Eigenschaften werden nur für bestimmte Dateicontainer und Bildcodecs unterstützt. Eine Auflistung der für jeden Bildtyp unterstützten Bildmetadaten finden Sie unter "Richtlinien für Fotometadaten".
Da eigenschaften, die nicht unterstützt werden, beim Abrufen möglicherweise einen NULL-Wert zurückgeben, überprüfen Sie immer auf NULL, bevor Sie einen zurückgegebenen Metadatenwert verwenden.
Geotag-Hilfsprogramm
GeotagHelper ist eine Hilfsklasse, die es erleichtert, Bilder mithilfe der Windows.Devices.Geolocation-APIs direkt mit geografischen Daten zu versehen, ohne das Metadatenformat manuell parsen oder erstellen zu müssen.
Wenn Sie bereits über ein Geopoint-Objekt verfügen, das den Standort darstellt, den Sie im Bild mit Geotags versehen möchten, sei es aus einer früheren Verwendung der Geolocation-APIs oder aus einer anderen Quelle, können Sie die Geotagdaten festlegen, indem Sie GeotagHelper.SetGeotagAsync aufrufen und ein StorageFile sowie den Geopoint übergeben.
private async void SetGeoDataFromPoint(StorageFile imageFile)
{
var point = new Geopoint(
new BasicGeoposition
{
Latitude = 48.8567,
Longitude = 2.3508,
});
await GeotagHelper.SetGeotagAsync(imageFile, point);
}
Um die Geotagdaten mithilfe des aktuellen Standorts des Geräts festzulegen, erstellen Sie ein neues Geolocator-Objekt und rufen Sie GeotagHelper.SetGeotagFromGeolocatorAsync auf, wobei Sie den Geolocator und die Datei übergeben, die mit Geotags versehen werden soll.
private async void SetGeoDataFromGeolocator(StorageFile imageFile)
{
var locator = new Geolocator();
// Shows the user consent UI if needed
var accessStatus = await Geolocator.RequestAccessAsync();
if (accessStatus == GeolocationAccessStatus.Allowed)
{
await GeotagHelper.SetGeotagFromGeolocatorAsync(imageFile, locator);
}
}
Sie müssen die Standortgerätefunktion in Ihr App-Manifest einschließen, um die SetGeotagFromGeolocatorAsync-API zu verwenden.
Sie müssen "RequestAccessAsync" aufrufen, bevor Sie "SetGeotagFromGeolocatorAsync " aufrufen, um sicherzustellen, dass der Benutzer Ihrer App die Berechtigung zum Verwenden seines Standorts erteilt hat.
Weitere Informationen zu Geolocation- und Karten-APIs finden Sie unter Kartensteuerelement.
Rufen Sie GetGeotagAsync auf, um einen GeoPoint abzurufen, der den geografischen Speicherort einer Bilddatei darstellt.
private async void GetGeoData(StorageFile imageFile)
{
Geopoint geoPoint = await GeotagHelper.GetGeotagAsync(imageFile);
}
Decodieren und Codieren von Bildmetadaten
Die fortschrittlichste Methode zum Arbeiten mit Bilddaten ist das Lesen und Schreiben der Eigenschaften auf Datenstromebene mithilfe eines BitmapDecoder oder eines BitmapEncoder. Bei diesen Vorgängen können Sie Windows Eigenschaften verwenden, um die Daten anzugeben, die Sie lesen oder schreiben, aber Sie können auch die von der Windows Imaging Component (WIC) bereitgestellte Metadatenabfragesprache verwenden, um den Pfad zu einer angeforderten Eigenschaft anzugeben.
Zum Lesen von Bildmetadaten mit dieser Technik müssen Sie über ein BitmapDecoder verfügen, das mit dem Quellbilddateidatenstrom erstellt wurde. Informationen dazu finden Sie unter Erstellen, Bearbeiten und Speichern von Bitmapbildern.
Nachdem Sie über den Decoder verfügen, erstellen Sie eine Liste mit Zeichenfolgen, und fügen Sie einen neuen Eintrag für jede metadateneigenschaft hinzu, die Sie abrufen möchten, entweder mithilfe der Windows Eigenschaftsbezeichnerzeichenfolge oder einer WIC-Metadatenabfrage. Rufen Sie die Methode BitmapPropertiesView.GetPropertiesAsync auf dem BitmapProperties-Member des Decoders auf, um die angegebenen Eigenschaften anzufordern. Die Eigenschaften werden in einem Wörterbuch mit Schlüssel-Wert-Paaren zurückgegeben, die den Eigenschaftennamen oder Pfad und den Eigenschaftswert enthalten.
private async void ReadImageMetadata(BitmapDecoder bitmapDecoder)
{
var requests = new System.Collections.Generic.List<string>();
requests.Add("System.Photo.Orientation"); // Windows property key for EXIF orientation
requests.Add("/xmp/dc:creator"); // WIC metadata query for Dublin Core creator
try
{
var retrievedProps = await bitmapDecoder.BitmapProperties.GetPropertiesAsync(requests);
ushort orientation;
if (retrievedProps.ContainsKey("System.Photo.Orientation"))
{
orientation = (ushort)retrievedProps["System.Photo.Orientation"].Value;
}
string creator;
if (retrievedProps.ContainsKey("/xmp/dc:creator"))
{
creator = (string)retrievedProps["/xmp/dc:creator"].Value;
}
}
catch (Exception err)
{
switch (err.HResult)
{
case unchecked((int)0x88982F41): // WINCODEC_ERR_PROPERTYNOTSUPPORTED
// The file format does not support the requested metadata.
break;
case unchecked((int)0x88982F81): // WINCODEC_ERR_UNSUPPORTEDOPERATION
// The file format does not support any metadata.
default:
throw;
}
}
}
Informationen zur WIC-Metadatenabfragesprache und den unterstützten Eigenschaften finden Sie unter WIC-Bildformat native Metadatenabfragen.
Viele Metadateneigenschaften werden nur von einer Teilmenge von Bildtypen unterstützt. GetPropertiesAsync schlägt mit dem Fehlercode fehl, 0x88982F41, wenn eine der angeforderten Eigenschaften vom dem Decoder zugeordneten Bild nicht unterstützt wird, und 0x88982F81, wenn das Bild überhaupt keine Metadaten unterstützt. Die diesen Fehlercodes zugeordneten Konstanten sind WINCODEC_ERR_PROPERTYNOTSUPPORTED und WINCODEC_ERR_UNSUPPORTEDOPERATION und werden in der Winerror.h-Headerdatei definiert.
Da ein Bild für eine bestimmte Eigenschaft möglicherweise einen Wert enthält oder auch nicht, verwenden Sie IDictionary.ContainsKey, um zu überprüfen, ob eine Eigenschaft in den Ergebnissen vorhanden ist, bevor Sie darauf zugreifen.
Zum Schreiben von Bildmetadaten in den Datenstrom ist ein BitmapEncoder erforderlich, der der Bildausgabedatei zugeordnet ist.
Erstellen Sie ein BitmapPropertySetobjekt, um die gewünschten Eigenschaftswerte zu enthalten. Erstellen Sie ein BitmapTypedValueobjekt, um den Eigenschaftswert darzustellen. Dieses Objekt verwendet ein object als Wert und Element der PropertyType Enumeration, die den Typ des Werts definiert. Fügen Sie bitmapTypedValue dem BitmapPropertySet hinzu, und rufen Sie dann BitmapProperties.SetPropertiesAsync auf, damit der Encoder die Eigenschaften in den Datenstrom schreibt.
private async void WriteImageMetadata(BitmapEncoder bitmapEncoder)
{
var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
var orientationValue = new Windows.Graphics.Imaging.BitmapTypedValue(
1, // Defined as EXIF orientation = "normal"
Windows.Foundation.PropertyType.UInt16);
propertySet.Add("System.Photo.Orientation", orientationValue);
try
{
await bitmapEncoder.BitmapProperties.SetPropertiesAsync(propertySet);
}
catch (Exception err)
{
switch (err.HResult)
{
case unchecked((int)0x88982F41): // WINCODEC_ERR_PROPERTYNOTSUPPORTED
// The file format does not support this property.
break;
default:
throw;
}
}
}
Ausführliche Informationen dazu, welche Eigenschaften für welche Bilddateitypen unterstützt werden, finden Sie unter Windows Properties, Photo Metadata Policies und WIC image format native Metadatenabfragen.
"SetPropertiesAsync " schlägt mit dem Fehlercode 0x88982F41 fehl, wenn eine der angeforderten Eigenschaften vom dem Encoder zugeordneten Bild nicht unterstützt wird.
Zugehörige Themen
Windows developer