Delen via


Overzicht van WIC-metagegevens

In dit onderwerp wordt de ondersteuning voor metagegevens voor imaging geïntroduceerd die wordt geleverd door het Windows Imaging Component (WIC). Het biedt een inleiding tot het lezen en schrijven van metagegevens van afbeeldingen, de metagegevensquerytaal en de uitbreidbaarheid van metagegevenshandlers.

Metagegevens van afbeeldingen zijn gegevens die zijn ingesloten in een afbeeldingsbestand met aanvullende informatie over de afbeelding, zoals het apparaat dat wordt gebruikt om de afbeelding of de afmetingen van de afbeelding vast te leggen. Hoewel deze zich in het afbeeldingsbestand zelf bevindt, maakt deze metagegevens geen deel uit van de renderinggegevens. WIC biedt interfaces waarmee u deze metagegevens kunt lezen en schrijven voor verschillende algemene metagegevensindelingen, waaronder Extensible Metadata Platform (XMP), Exchangeable Image File (EXIF) en PNG Textual Data (tEXt).

Dit onderwerp bevat de volgende secties.

Voorwaarden

Als u dit onderwerp wilt begrijpen, moet u bekend zijn met de WIC-encoder- en decoderinterfaces en de bijbehorende COM-onderdelen (Component Object Model), zoals beschreven in de Overzicht van Windows Imaging-onderdelen. Het helpt ook om algemene bekendheid te hebben met enkele van de indelingen voor metagegevens van afbeeldingen die momenteel worden gebruikt.

Introductie

Metagegevens bieden uitgebreide informatie over een afbeelding. Deze informatie kan op verschillende manieren worden gebruikt. Een afbeelding kan metagegevens bevatten, zoals een beschrijving, beoordeling, categorietags en copyrightinformatie. Door toegang te krijgen tot de metagegevens kunt u eenvoudiger taken uitvoeren, zoals assetbeheer, bestandslocatie of het bepalen van copyrightgegevens. Met de Windows Photo Gallery in Windows Vista kunt u bijvoorbeeld beschrijvingen en categorietags toevoegen aan afbeeldingen. Dit maakt het mogelijk om afbeeldingen beter te vinden en een handige manier om afbeeldingen te categoriseren. Met behulp van de WIC-API's en algemene metagegevensindelingen kunnen toepassingen dit type metagegevens eenvoudig schrijven of lezen van of naar afbeeldingen.

In het volgende diagram ziet u de inhoud van een JPEG-bestand, met daarin ingesloten metagegevensblokken en metagegevensitems.

jpeg-afbeelding met metagegevens van classificatie

In dit voorbeeld worden de metagegevens ingesloten in het afbeeldingsbestand in een afbeeldingsframe. De JPEG-indeling biedt geen ondersteuning voor meerdere afbeeldingsframes, dus de metagegevens worden conceptueel gekoppeld aan dit enkele frame. Indelingen die ondersteuning bieden voor meerdere frames, zoals TIFF, kunnen metagegevens bevatten die zijn gekoppeld aan elk afbeeldingsframe, zoals in dit diagram wordt weergegeven. Hoewel dit momenteel niet gebruikelijk is en niet wordt ondersteund door de systeemeigen afbeeldingscodecs, ondersteunen sommige afbeeldingsindelingen mogelijk ook metagegevens buiten een afbeeldingsframe. WIC is flexibel genoeg om zowel metagegevens op frameniveau als metagegevens buiten het afzonderlijke frame van een afbeelding te verwerken.

Metagegevens van afbeelding lezen

De WIC-API's bieden COM-onderdelen waarmee toepassingen eenvoudig metagegevens van afbeeldingen kunnen lezen en schrijven.

De primaire manier om metagegevens te lezen, is het gebruik van een metagegevensquerylezer (IWICMetadataQueryReader) voor toegang tot specifieke metagegevensitems. Het onderdeel metagegevensquerylezer wordt geïmplementeerd door de codec en kan worden geopend op decoderniveau of via afzonderlijke afbeeldingsframes. Dit is de meest voorkomende methode. De volgende code laat zien hoe u toegang krijgt tot een querylezer voor een enkel frame met behulp van de GetMetadataQueryReader-methode.

// Get the query reader
if (SUCCEEDED(hr))
{
    hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}

Een querylezer biedt methoden voor het verkrijgen van informatie over specifieke metagegevens en een manier om een metagegevensitem op te geven dat moet worden opgehaald. De volgende code maakt gebruik van een query-expressie om een specifiek metadata-item aan te vragen in het geneste afbeeldingsbestandsmap (IFD)-blok van App1. Dit wordt gedaan met behulp van de methode GetMetadataByName van de querylezer. De volgende code laat zien hoe u de querylezer gebruikt om de MicrosoftPhoto-beoordelingswaarde te verkrijgen.

PROPVARIANT value;
PropVariantInit(&value);

LPCWSTR pwzRatingQuery = L"/app1/ifd/{ushort=18249}";

if (SUCCEEDED(hr))
{
    hr = pQueryReader->GetMetadataByName(pwzRatingQuery, &value);
}

De variabele pwzRatingQuery in het voorgaande voorbeeld is de queryreeks om toegang te verkrijgen tot het metagegevensitem MicrosoftPhoto-rating. Deze tekenreeks wordt gemaakt met behulp van de querytaal voor metagegevens. Om deze string te maken, is kennis van het metagegevensformaat en de metagegevensquerytaal nodig om afzonderlijke metagegevensitems op te halen. Voor meer informatie over de metagegevensquerytaal, zie het Overzicht van de metagegevensquerytaal.

Achter de schermen gebruikt een querylezer een metagegevenslezer (IWICMetadataReader) voor toegang tot de metagegevens die door de query-expressie worden beschreven. Naast het gebruik van een querylezer kunt u ook rechtstreeks toegang krijgen tot een metagegevenslezer om metagegevens te lezen. U kunt een metagegevenslezer verkrijgen van de decoder of afzonderlijke frames door een query uit te voeren op een bloklezer (IWICMetadataBlockReader) interface.

Metagegevens van afbeelding schrijven

Het proces van het schrijven van metagegevens is vergelijkbaar met de manier waarop deze wordt gelezen, behalve dat een schrijver van metagegevensquery's (IWICMetadataQueryWriter) wordt gebruikt. De query writer-interface wordt geïmplementeerd door de beeldencoder en, zoals in de querylezer, zijn metagegevens zowel toegankelijk op de encoder als op afzonderlijke frames (afhankelijk van de ondersteuning voor het afbeeldingsformaat).

De volgende code laat zien hoe u een queryschrijver ophaalt uit een encoderframe en de beoordelingswaarde verwijdert die eerder is gelezen.

// Get the frame's query writer
if (SUCCEEDED(hr))
{
    hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
}

if (SUCCEEDED(hr))
{
    hr = pFrameQWriter->RemoveMetadataByName(L"/app1/ifd/{ushort=18249}");
}

Een andere manier om metagegevens te schrijven, is via snelle updates voor metagegevens. Snelle metagegevenscodering is een manier om metagegevens van afbeeldingen te schrijven zonder dat u een afbeeldingsbestand opnieuw hoeft te coderen. Dit wordt gedaan door nieuwe metagegevensgegevens naar een opgevulde regio van de metagegevensindeling te schrijven. De snelle metagegevensencoder (IWICFastMetadataEncoder) wordt verkregen van de componentenfabriek, op basis van de afbeeldingsdecoder. De snelle metagegevensencoder krijgt vervolgens een schrijver voor query's die wordt gebruikt voor het schrijven van de metagegevens. Ten slotte voert de snelle encoder de wijziging door.

De volgende code laat zien hoe u een snelle metagegevenscoderingsprogramma kunt verkrijgen en deze kunt gebruiken om de MicrosoftRating-waarde te schrijven.

if (SUCCEEDED(hr))
{
    IWICFastMetadataEncoder *pFME = NULL;
    IWICMetadataQueryWriter *pFMEQW = NULL;

    hr = pFactory->CreateFastMetadataEncoderFromFrameDecode(
        pFrameDecode,
        &pFME);

    if (SUCCEEDED(hr))
    {
        hr = pFME->GetMetadataQueryWriter(&pFMEQW);
    }

    if (SUCCEEDED(hr))
    {
        // Add additional metadata
        PROPVARIANT value;

        PropVariantInit(&value);

        value.vt = VT_UI4;
        value.uiVal = 99;
        hr = pFMEQW->SetMetadataByName(L"/app1/ifd/{ushort=18249}", &value);

        PropVariantClear(&value);
    }

    if (SUCCEEDED(hr))
    {
        hr = pFME->Commit();
    }
}

Niet alle indelingen voor metagegevens ondersteunen snelle metagegevens. Zie de tabel in de sectie Ondersteunde metagegevensindelingen sectie verderop in dit document om te zien welke systeemeigen ondersteunde indelingen ondersteuning bieden voor snelle codering van metagegevens.

Achter de schermen maakt een queryschrijver gebruik van een metagegevensschrijver (IWICMetadataWriter) om de metagegevens te schrijven die worden beschreven door de query-expressie. Naast het gebruik van een querylezer kunt u ook rechtstreeks toegang krijgen tot een schrijver van metagegevens om metagegevens te schrijven. U kunt een schrijver voor metagegevens verkrijgen van de decoder of afzonderlijke frames door te zoeken naar een interface voor blokschrijvers (IWICMetadataBlockWriter).

Uitbreidbaarheid van metagegevens

Zoals eerder vermeld, biedt WIC verschillende metagegevenshandlers voor het lezen en schrijven van metagegevens voor algemene metagegevensindelingen. Er zijn echter enkele indelingen voor metagegevens die niet systeemeigen worden ondersteund. Daarom biedt WIC API's voor het maken van extra metagegevenshandlers die ondersteuning voor metagegevens kunnen uitbreiden naar andere indelingen.

Om andere indelingen voor metagegevens volledig te ondersteunen, moeten twee typen handlers worden ontwikkeld: een metagegevenslezer voor het lezen van metagegevens en een schrijver van metagegevens om metagegevens te schrijven. Hoewel deze twee handlers meestal worden geïmplementeerd in paren voor een specifieke indeling, is dat geen vereiste. Er kunnen enkele gevallen zijn waarin alleen de leesmogelijkheid of alleen de schrijfmogelijkheid nodig is.

Zie het Overzicht van uitbreidbaarheid van metagegevensvoor meer informatie over de uitbreidbaarheid van metagegevens met behulp van de WIC-API's.

Ondersteunde metagegevensindelingen

WIC biedt ondersteuning voor verschillende algemene metagegevensindelingen. De volgende tabel bevat de ondersteunde metagegevensindelingen, hun versies, de afbeeldingsindelingen die ondersteuning bieden voor de metagegevensindeling en of de metagegevensindeling snelle codering van metagegevens ondersteunt. Zie de sectie Metagegevens van afbeeldingen schrijven eerder in dit document voor meer informatie over snelle metadata-encoding.

Ondersteunde indelingen voor metagegevens Versie van metagegevensspecificatie Ondersteuning van afbeeldingsformaten Ondersteunt snelle codering van metagegevens
App0 JFIF 1.02 JPEG Nee
App1 JFIF 1.02 JPEG, TIFF Nee
App13 Onbekend JPEG, TIFF Nee
IFD TIFF 6.0 JPEG, TIFF Ja
Ethische beoordelingscommissie (IRB) Onbekend JPEG, TIFF Nee
Exif Exif 2.2 JPEG, TIFF Ja
XMP XMP 1.0 (september 2005) JPEG, TIFF Ja
GPS Exif 2.2 JPEG, TIFF Ja
IPTC IPTC 4.0 JPEG, TIFF Ja
tekst PNG 1.2 PNG Nee

 

Notitie

IPTC ondersteunt alleen FME als de blokken groter worden, omdat IPTC geen padding ondersteunt.

 

Samenvatting van metagegevensonderdelen

In de volgende tabel worden de WIC-interfaces beschreven die metagegevens ondersteunen en de bijbehorende onderdelen. Deze onderdelen bieden de toegang tot de metagegevens van een afbeelding. Zie het Overzicht van Windows Imaging-onderdelen voor meer informatie over deze onderdelen.

Bestanddeel Beschrijving
Bitmap decoder (IWICBitmapDecoder)
  • Hiermee leest u een afbeeldingsstroom en produceert u een bruikbare bitmapbron. Gekoppeld aan een containerindeling zoals Tiff (Tagged Image File Format) of Joint Photographic Experts Group (JPEG).
  • Implementeert een IWICMetadataBlockReader interface om alle metagegevensblokken in de gegevensstroom van de decoder op te sommen die zich niet in een frame bevinden.
  • Stelt een querylezer beschikbaar om de metagegevens te lezen die zijn gekoppeld aan de afbeelding die zich niet in een frame bevindt.
Bitmap Frame Decode (IWICBitmapFrameDecode)
  • Hiermee opent u afzonderlijke frames uit de afbeeldingsstroom die door de decoder wordt vastgehouden.
  • Implementeert een IWICMetadataBlockReader interface om alle metagegevensblokken in de gegevensstroom van het frame op te sommen.
  • Hiermee wordt het mogelijk voor een lezer om de metagegevens te lezen die zijn gekoppeld aan het frame, via query-expressies.
Bitmap Encoder (IWICBitmapEncoder)
  • Hiermee schrijft u een bitmapbron naar een afbeeldingsstroom. Gekoppeld aan een containerindeling zoals TIFF of JPEG.
  • Implementeert een IWICMetadataBlockWriter interface om een lijst met metagegevensblokken op te bouwen die moeten worden geschreven naar de gegevensstroom van de encoder.
  • Hiermee maakt u een queryschrijver beschikbaar om de metagegevens te schrijven die zijn gekoppeld aan de afbeelding, met behulp van query-expressies.
Bitma Frame Encode (IWICBitmapFrameEncode)
  • Hiermee maakt u een frame dat wordt gecodeerd in de stream die door de encoder wordt bewaard.
  • Implementeert een IWICMetadataBlockWriter interface om een lijst met metagegevensblokken op te bouwen die moeten worden geschreven in de gegevensstroom van het frame.
  • Hiermee maakt u een queryschrijver beschikbaar voor het schrijven van de metagegevens die aan het frame zijn gekoppeld, met behulp van query-expressies.

 

In de volgende tabel worden de WIC-metagegevensonderdelen beschreven. Met deze onderdelen kunt u de metagegevens lezen en schrijven in een afbeelding die wordt weergegeven door de onderdelen in de vorige tabel.

Bestanddeel Beschrijving
Metagegevensquerylezer (IWICMetadataQueryReader)
  • Gebruikt een querytekenreeks en navigeert door de onderliggende metagegevenshiërarchie om metagegevens op te halen.
Metadata Query Writer (IWICMetadataQueryWriter)
  • Gebruikt een querytekenreeks en navigeert door de onderliggende metagegevenshiërarchie om metagegevens op te halen, in te stellen en te verwijderen.
Metagegevensbloklezer (IWICMetadataBlockReader)
  • Beheert een alleen-lezen verzameling van IWICMetadataReader objecten bovenaan in de hiërarchie van metagegevens en maakt enumeratie van alle metagegevensblokken mogelijk.
  • Geïmplementeerd door een bitmapdecoder en een gedecodeerd bitmapframe.
  • Geïmplementeerd door ontwikkelaars van onderdelen van derden voor aangepaste codecs.
Metadata Block Writer (IWICMetadataBlockWriter)
  • Beheert een lees- en schrijfverzameling van IWICMetadataWriter objecten aan de bovenkant van de metagegevenshiërarchie.
  • Geïmplementeerd door een bitmap-encoder en een bitmapframe-encoder.
  • Geïmplementeerd door ontwikkelaars van onderdelen van derden voor aangepaste codecs.
Metagegevenslezer (IWICMetadataReader)
  • Parseert een metagegevensstroom en beheert een alleen-lezen verzameling van de metagegevensitems. Gekoppeld aan een indeling voor metagegevens, zoals EXIF, IFD en XMP.
  • Fungeert als een woordenlijst, die een waarde retourneert wanneer een notatie- en id-paar wordt gegeven.
  • Geïmplementeerd door ontwikkelaars van onderdelen van derden voor aangepaste metagegevenstypen.
Metadata Writer (IWICMetadataWriter)
  • Parseert en serialiseert een stroom van metagegevens en beheert een lees-/schrijfverzameling van metagegevensitems.
  • Geïmplementeerd door ontwikkelaars van onderdelen van derden voor aangepaste metagegevenstypen.
Fast Metadata EncoderIWICFastMetadataEncoder
  • Stelt semantiek beschikbaar voor het schrijven op een metagegevenshiërarchie die metagegevens bijwerkt zonder de afbeelding opnieuw te coderen.

 

Conceptuele

Overzicht van Windows Imaging-onderdelen

Overzicht van metagegevensquerytaal

Overzicht van metagegevens van lees- en schrijfafbeeldingen

Overzicht van uitbreidbaarheid van metagegevens

Instructies: Een JPEG-afbeelding opnieuw coderen met metagegevens