Dela via


Översikt över WIC-metadata

I det här avsnittet beskrivs stöd för metadata för avbildning som tillhandahålls av Windows Imaging Component (WIC). Det ger en introduktion till att läsa och skriva bildmetadata, metadatafrågespråket och utökningsbarhet för metadatahanterare.

Bildmetadata är data som är inbäddade i en bildfil som innehåller ytterligare information om bilden, till exempel den enhet som används för att avbilda bilden eller bildens dimensioner. Även om den finns i själva bildfilen är dessa metadata inte en del av återgivningsdata. WIC tillhandahåller gränssnitt som gör att du kan läsa och skriva dessa metadata för flera vanliga metadataformat, inklusive XMP (Extensible Metadata Platform), Exchangeable Image File (EXIF) och Png Textual Data (tEXt).

Det här avsnittet innehåller följande avsnitt.

Förutsättningar

För att förstå det här ämnet bör du känna till WIC-kodarens och avkodarens gränssnitt samt deras relaterade komponenter i komponentobjektmodellen (COM), enligt beskrivningen i Windows Imaging Component-översikt. Det hjälper också att ha en allmän kännedom om några av de bildmetadataformat som används idag.

Introduktion

Metadata ger utökad information om en bild. Den här informationen kan användas på flera olika sätt. En bild kan innehålla metadata som en beskrivning, klassificering, kategoritaggar och upphovsrättsinformation. Genom att komma åt metadata blir det enklare att utföra uppgifter som tillgångshantering, filplats eller att fastställa upphovsrättsinformation. Med Windows Fotogalleri i Windows Vista kan du till exempel lägga till beskrivningar och kategoritaggar i bilder. Detta ger bättre identifiering av bilder och ett bekvämt sätt att kategorisera bilder. Med hjälp av WIC-API:er och vanliga metadataformat kan program enkelt skriva eller läsa den här typen av metadata till eller från bilder.

Följande diagram illustrerar innehållet i en JPEG-fil som innehåller inbäddade metadatablock och metadataobjekt.

jpeg-bild med klassificeringsmetadata

I den här exempelbilden bäddas metadata in i bildfilen i en bildram. JPEG-formatet stöder inte flera bildramar, så metadata är konceptuellt kopplade till den här enkla ramen. Format som stöder flera bildrutor, till exempel TIFF, kan ha metadata kopplade till varje bildram som det här diagrammet visar. Även om det inte är vanligt idag och inte stöds av de inbyggda bild codecs, kan vissa bildformat också stödja metadata utanför en bildram. WIC är tillräckligt flexibelt för att hantera både metadata på ramnivå och metadata utanför en bilds enskilda ram.

Läsa bildmetadata

WIC-API:erna tillhandahåller COM-komponenter som gör det enkelt för program att läsa och skriva bildmetadata.

Det primära sättet att läsa metadata är att använda en metadatafrågasläsare (IWICMetadataQueryReader) för att få åtkomst till specifika metadataobjekt. Komponenten för metadatafrågasläsare implementeras av codec och kan nås på avkodarnivå eller via enskilda bildramar, vilket är den vanligaste metoden. Följande kod visar hur du får åtkomst till en frågeläsare för en enskild ram med hjälp av frågeläsarens GetMetadataQueryReader-metod.

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

En frågeläsare innehåller metoder för att hämta information om specifika metadata och ett sätt att ange ett metadataobjekt som ska hämtas. Följande kod använder ett frågeuttryck för att begära ett specifikt metadataobjekt i ifd-blocket (App1 nested image file directory). Detta görs med hjälp av frågeläsarens GetMetadataByName--metod. Följande kod visar hur du använder frågeläsaren för att hämta MicrosoftPhoto-klassificeringsvärdet.

PROPVARIANT value;
PropVariantInit(&value);

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

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

Variabeln pwzRatingQuery i föregående exempel är frågesträngen för åtkomst till metadataobjektet MicrosoftPhoto-klassificering. Den här strängen skapas med hjälp av metadatafrågespråket. För att skapa den här strängen krävs kunskap om metadataformatet och metadatafrågespråket för att hämta enskilda metadataobjekt. Mer information om frågespråket för metadata finns i Översikt över frågespråk för metadata.

I bakgrunden använder en frågeläsare en metadataläsare (IWICMetadataReader) för att komma åt metadata som beskrivs av frågeuttrycket. Förutom att använda en frågeläsare kan du också komma åt en metadataläsare direkt för att läsa metadata. Du kan hämta en metadataläsare från avkodaren eller enskilda ramar genom att fråga efter en blockläsare (IWICMetadataBlockReader) gränssnitt.

Skriva bildmetadata

Processen för att skriva metadata liknar hur den läss förutom att en metadatafrågeskrivare (IWICMetadataQueryWriter) används. Frågeskrivarens gränssnitt implementeras av bildkodaren och precis som i frågeläsaren används metadata både på kodaren och på enskilda bildrutor (beroende på stöd för bildformat).

Följande kod visar hur du hämtar en frågeskrivare från en kodarram och tar bort det klassificeringsvärde som tidigare lästes.

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

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

Ett annat sätt att skriva metadata är genom snabba metadatauppdateringar. Snabb metadatakodning är ett sätt att skriva bildmetadata utan att behöva koda om en bildfil. Detta görs genom att skriva ny metadatainformation till en vadderad region i metadataformatet. Den snabba metadatakodaren (IWICFastMetadataEncoder) hämtas från komponentfabriken, baserat på bilddekodaren. Den snabba metadatakodaren hämtar sedan en frågeskrivare som används för att skriva metadata. Slutligen genomför den snabba kodaren ändringen.

Följande kod visar hur du hämtar en snabb metadatakodare och använder den för att skriva MicrosoftRating-värdet.

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

Alla metadataformat stöder inte snabba metadata. Om du vill se vilka format som stöds internt stöder snabb metadatakodning kan du läsa tabellen i avsnittet metadataformat som stöds senare i det här dokumentet.

I bakgrunden använder en frågeskrivare en metadataskrivare (IWICMetadataWriter) för att skriva metadata som beskrivs av frågeuttrycket. Förutom att använda en frågeläsare kan du också komma åt en metadataskrivare direkt för att skriva metadata. Du kan hämta en metadataskrivare från avkodaren eller enskilda bildrutor genom att fråga efter en blockskrivare (IWICMetadataBlockWriter) gränssnitt.

Utökningsbarhet för metadata

Som tidigare nämnts tillhandahåller WIC flera metadatahanterare för att läsa och skriva metadata för vanliga metadataformat. Det finns dock vissa metadataformat som inte stöds internt. Därför tillhandahåller WIC API:er för att skapa ytterligare metadatahanterare som kan utöka metadatastöd till andra format.

För att fullt ut stödja andra metadataformat måste två typer av hanterare utvecklas – en metadataläsare för att läsa metadata och en metadataskrivare för att skriva metadata. Även om dessa två hanterare vanligtvis implementeras i par för ett visst format är det inte ett krav. Det kan finnas vissa fall där endast läsförmågan eller endast skrivförmågan behövs.

Mer information om utökningsbarhet av metadata med hjälp av WIC-API:er finns i Översikt över utökningsbarhet för metadata.

Metadataformat som stöds

WIC har stöd för flera vanliga metadataformat. I följande tabell visas de metadataformat som stöds, deras versioner, de bildformat som stöder metadataformatet och om metadataformatet stöder snabb metadatakodning. Mer information om snabb metadatakodning finns i avsnittet Skriva bildmetadata tidigare i det här dokumentet.

Metadataformat som stöds Metadataspecifikationsversion Stöd för bildformat Stöder snabb metadatakodning
App0 JFIF 1.02 JPEG Nej
App1 JFIF 1.02 JPEG, TIFF Nej
App13 Okänd JPEG, TIFF Nej
IFD TIFF 6.0 JPEG, TIFF Ja
IRB Okänd JPEG, TIFF Nej
Exif Exif 2.2 JPEG, TIFF Ja
XMP XMP 1.0 (sept 2005) JPEG, TIFF Ja
GPS Exif 2.2 JPEG, TIFF Ja
IPTC IPTC 4.0 JPEG, TIFF Ja
TEXT PNG 1.2 PNG Nej

 

Not

IPTC stödjer endast FME om blocken ökar i storlek, eftersom IPTC inte stödjer utfyllnad.

 

Sammanfattning av metadatakomponent

I följande tabell beskrivs de WIC-gränssnitt som stöder metadata och deras motsvarande komponenter. Dessa komponenter ger åtkomst till en bilds metadata. För mer information om dessa komponenter, se Windows Imaging-komponentens översikt.

Komponent Beskrivning
Bitmappskodare (IWICBitmapDecoder)
  • Läser en bildström och skapar en användbar bitmappskälla. Associerad med ett containerformat som TIFF (Tagged Image File Format) eller Joint Photographic Experts Group (JPEG).
  • Implementerar ett IWICMetadataBlockReader- gränssnitt för att räkna upp alla metadatablock i avkodarens dataström som inte finns i en ram.
  • Gör en frågeläsare tillgänglig för att läsa de metadata som är associerade med bilden som inte finns i en ram.
Avkoda bitmappram (IWICBitmapFrameDecode)
  • Åtkomst till enskilda bildrutor från avkodarens bildström.
  • Implementerar ett IWICMetadataBlockReader--gränssnitt för att räkna upp alla metadatablock i ramens dataström.
  • Gör en frågeläsare tillgänglig för att läsa metadata som är associerade med ramen med hjälp av frågeuttryck.
Bitmappskodare (IWICBitmapEncoder)
  • Skriver en bitmap källa till en bildström. Associerad med ett containerformat som TIFF eller JPEG.
  • Implementerar ett IWICMetadataBlockWriter--gränssnitt för att bygga upp en lista över metadatablock att skriva in i kodarens dataström.
  • Gör en frågeskrivare tillgänglig för att skriva metadata som är associerade med bilden med hjälp av frågeuttryck.
Bitma Frame Encode (IWICBitmapFrameEncode)
  • Skapar en ram som ska kodas i dataströmmen som lagras av kodaren.
  • Implementerar ett IWICMetadataBlockWriter--gränssnitt för att skapa en lista över metadatablock som ska skrivas till ramens dataström.
  • Gör en frågeskrivare tillgänglig för att skriva metadata som är associerade med ramen med hjälp av frågeuttryck.

 

I följande tabell beskrivs WIC-metadatakomponenterna. Med de här komponenterna kan du läsa och skriva metadata i en bild som exponeras av de komponenter som anges i föregående tabell.

Komponent Beskrivning
Metadata Query Reader (IWICMetadataQueryReader)
  • Tar en frågesträng och navigerar i den underliggande metadatahierarkin för att hämta metadata.
Metadata Query Writer (IWICMetadataQueryWriter)
  • Tar en frågesträng och navigerar i den underliggande metadatahierarkin för att hämta, ange och ta bort metadata.
Metadatablockläsare (IWICMetadataBlockReader)
  • Hanterar en skrivskyddad samling med IWICMetadataReader objekt överst i metadatahierarkin och möjliggör enumeration av samtliga metadatablock.
  • Implementerad av en bitmappsdekodare och en dekodad bitmappsram.
  • Implementerad av tredjepartskomponentutvecklare för anpassade codecs.
Metadata Block Writer (IWICMetadataBlockWriter)
  • Hanterar en läs- och skrivsamling med IWICMetadataWriter objekt överst i metadatahierarkin.
  • Implementerad av en bitmappskodare och en bitmappsramkodare.
  • Implementerad av tredjepartskomponentutvecklare för anpassade codecs.
Metadataläsare (IWICMetadataReader)
  • Parsar en dataström med metadata och hanterar en skrivskyddad samling av metadataobjekt. Associerat med ett metadataformat som EXIF, IFD och XMP.
  • Fungerar som en ordlista och returnerar ett värde när du får ett format och ett ID-par.
  • Implementerad av tredjepartskomponentutvecklare för anpassade metadatatyper.
Metadata Writer (IWICMetadataWriter)
  • Parsar och serialiserar en dataström med metadata och hanterar en läs-/skrivsamling med metadataobjekt.
  • Implementerad av tredjepartskomponentutvecklare för anpassade metadatatyper.
Snabb metadatakodareIWICFastMetadataEncoder
  • Exponerar semantik för skrivning i en metadatahierarki som uppdaterar metadata på plats utan att omkoda bilden.

 

konceptuell

Översikt över Windows Imaging-komponenten

Översikt över frågespråk för metadata

översikt över att läsa och skriva bildmetadata

Översikt över utökningsbarhet av metadata

Instruktioner: Koda om en JPEG-bild med metadata