Metagegevens van afbeelding

In dit artikel wordt beschreven hoe u metagegevenseigenschappen van afbeeldingen kunt lezen en schrijven en hoe u geotag-bestanden kunt lezen en schrijven met behulp van de hulpprogrammaklasse GeotagHelper.

Afbeeldingseigenschappen

De eigenschap StorageFile.Properties retourneert een StorageItemContentProperties object dat toegang biedt tot inhoudsgerelateerde informatie over het bestand. Haal de afbeeldingsspecifieke eigenschappen op door GetImagePropertiesAsync aan te roepen. Het geretourneerde ImageProperties-object bevat leden met basisvelden voor metagegevens van afbeeldingen, zoals de titel van de afbeelding en de datum van vastleggen.

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;
}

Als u toegang wilt krijgen tot een grotere set bestandsmetagegevens, gebruikt u het Windows Property System, een set eigenschappen van bestandsmetagegevens die kunnen worden opgehaald met een unieke tekenreeks-id. Maak een lijst met tekenreeksen en voeg de id toe voor elke eigenschap die u wilt ophalen. De methode ImageProperties.RetrievePropertiesAsync gebruikt deze lijst met tekenreeksen en retourneert een woordenlijst van sleutel-/waardeparen waarbij de sleutel de eigenschaps-id is en de waarde de eigenschapswaarde is.

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"];
    }
}
  • Zie Windows Properties voor een volledige lijst met Windows Eigenschappen, inclusief de id's en het type voor elke eigenschap.

  • Sommige eigenschappen worden alleen ondersteund voor bepaalde bestandscontainers en afbeeldingscodecs. Zie Beleid voor fotometagegevens voor een lijst met metagegevens die voor elk afbeeldingstype worden ondersteund.

  • Omdat eigenschappen die niet worden ondersteund, een null-waarde kunnen retourneren wanneer ze worden opgehaald, controleert u altijd op null voordat u een geretourneerde metagegevenswaarde gebruikt.

Geotag-hulpprogramma

GeotagHelper is een hulpprogrammaklasse waarmee u eenvoudig afbeeldingen met geografische gegevens kunt taggen met behulp van de Windows. Devices.Geolocation API's rechtstreeks, zonder dat u de metagegevensindeling handmatig hoeft te parseren of samenstellen.

Als u al een Geopoint-object hebt dat de locatie aangeeft die u aan de afbeelding wilt taggen, hetzij uit een eerder gebruik van de geolocatie-API's of uit een andere bron, kunt u de geotaggegevens instellen door GeotagHelper.SetGeotagAsync aan te roepen en een StorageFile en het object Geopoint door te geven.

private async void SetGeoDataFromPoint(StorageFile imageFile)
{
    var point = new Geopoint(
        new BasicGeoposition
        {
            Latitude = 48.8567,
            Longitude = 2.3508,
        });

    await GeotagHelper.SetGeotagAsync(imageFile, point);
}

Als u de geotaggegevens wilt instellen met de huidige locatie van het apparaat, maakt u een nieuw Geolocator-object en roept u GeotagHelper.SetGeotagFromGeolocatorAsync aan, waarbij u de Geolocator en het bestand dat van een geotag moet worden voorzien, doorgeeft.

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);
    }
}

Als u een GeoPoint wilt ophalen dat de geolabelde locatie van een afbeeldingsbestand vertegenwoordigt, roept u GetGeotagAsync aan.

private async void GetGeoData(StorageFile imageFile)
{
    Geopoint geoPoint = await GeotagHelper.GetGeotagAsync(imageFile);
}

Metagegevens van afbeeldingen decoderen en coderen

De meest geavanceerde manier om met afbeeldingsgegevens te werken, is door de eigenschappen op stroomniveau te lezen en te schrijven met behulp van een BitmapDecoder of een BitmapEncoder. Voor deze bewerkingen kunt u Windows Eigenschappen gebruiken om de gegevens op te geven die u leest of schrijft, maar u kunt ook de metagegevensquerytaal van de Windows Imaging Component (WIC) gebruiken om het pad naar een aangevraagde eigenschap op te geven.

Voor het lezen van metagegevens van afbeeldingen met deze techniek moet u beschikken over een BitmapDecoder die is gemaakt op basis van de stream van het bronafbeeldingsbestand. Zie Bitmapafbeeldingen maken, bewerken en opslaan voor meer informatie over hoe u dit doet.

Zodra u de decoder hebt, maakt u een lijst met tekenreeksen en voegt u een nieuwe vermelding toe voor elke metagegevenseigenschap die u wilt ophalen, met behulp van de tekenreeks Windows eigenschaps-id of een WIC-metagegevensquery. Roep de methode BitmapPropertiesView.GetPropertiesAsync aan op het BitmapProperties-lid van de decoder om de opgegeven eigenschappen op te vragen. De eigenschappen worden geretourneerd in een woordenlijst met sleutel-/waardeparen die de eigenschapsnaam of het pad en de eigenschapswaarde bevatten.

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;
        }
    }
}
  • Zie systeemeigen query's voor metagegevens van de WIC-afbeeldingsindeling voor informatie over de querytaal voor WIC-metagegevens en de ondersteunde eigenschappen.

  • Veel eigenschappen van metagegevens worden alleen ondersteund door een subset van afbeeldingstypen. GetPropertiesAsync mislukt met de foutcode 0x88982F41 als een van de aangevraagde eigenschappen niet wordt ondersteund door de afbeelding die is gekoppeld aan de decoder en 0x88982F81 als de afbeelding helemaal geen ondersteuning biedt voor metagegevens. De constanten die bij deze foutcodes horen, zijn WINCODEC_ERR_PROPERTYNOTSUPPORTED en WINCODEC_ERR_UNSUPPORTEDOPERATION en zijn gedefinieerd in het headerbestand winerror.h.

  • Omdat een afbeelding al dan niet een waarde voor een bepaalde eigenschap bevat, gebruikt u IDictionary.ContainsKey om te controleren of een eigenschap aanwezig is in de resultaten voordat u deze probeert te openen.

Voor het schrijven van metagegevens van afbeeldingen naar de stream is een BitmapEncoder vereist die is gekoppeld aan het uitvoerbestand van de afbeelding.

Maak een BitmapPropertySet-object waarin de eigenschapswaarden worden opgenomen die u wilt instellen. Maak een BitmapTypedValue-object om de eigenschapswaarde weer te geven. Dit object maakt gebruik van een object als waarde en lid van de PropertyType opsomming waarmee het type van de waarde wordt gedefinieerd. Voeg de BitmapTypedValue toe aan de BitmapPropertySet en roep vervolgens BitmapProperties.SetPropertiesAsync aan om ervoor te zorgen dat de encoder de eigenschappen naar de stream schrijft.

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;
        }
    }
}