Übersicht über WIC-Metadaten

In diesem Thema wird die Unterstützung von Imagemetadaten vorgestellt, die von der Windows Imaging Component (WIC) bereitgestellt wird. Es bietet eine Einführung in das Lesen und Schreiben von Bildmetadaten, die Metadatenabfragesprache und die Erweiterbarkeit des Metadatenhandlers.

Bildmetadaten sind Daten, die in eine Bilddatei eingebettet sind, die zusätzliche Informationen zum Bild enthält, z. B. das Gerät, das zum Erfassen des Bilds verwendet wird, oder die Abmessungen des Bilds. Obwohl sie in der Bilddatei selbst enthalten ist, sind diese Metadaten nicht Teil der Renderingdaten. WIC bietet Schnittstellen, mit denen Sie diese Metadaten für mehrere gängige Metadatenformate lesen und schreiben können, einschließlich Extensible Metadata Platform (XMP), Exchangeable Image File (EXIF) und Png Textual Data (tEXt).

Dieses Thema enthält folgende Abschnitte:

Voraussetzungen

Um dieses Thema zu verstehen, sollten Sie mit den WIC-Encoder- und Decoderschnittstellen und den zugehörigen COM-Komponenten (Component Object Model) vertraut sein, wie in der Übersicht über windows Imaging-Komponenten beschrieben. Außerdem ist es hilfreich, sich allgemein mit einigen der heute verwendeten Bilderstellungsmetadatenformate vertraut zu machen.

Einführung

Metadaten stellen erweiterte Informationen zu einem Bild bereit. Diese Informationen können auf verschiedene Arten verwendet werden. Ein Bild kann Metadaten wie eine Beschreibung, eine Bewertung, Kategorietags und Copyrightinformationen enthalten. Der Zugriff auf die Metadaten erleichtert die Ausführung von Aufgaben wie der Verwaltung von Ressourcen, des Dateispeicherorts oder das Ermitteln von Copyrightinformationen. Mit der Windows-Fotogalerie in Windows Vista können Sie beispielsweise Beschreibungen und Kategorietags zu Bildern hinzufügen. Dies ermöglicht eine bessere Auffindbarkeit von Bildern und eine bequeme Möglichkeit zum Kategorisieren von Bildern. Mithilfe der WIC-APIs und gängigen Metadatenformate können Anwendungen diese Art von Metadaten ganz einfach in oder aus Bildern schreiben oder lesen.

Das folgende Diagramm veranschaulicht den Inhalt einer JPEG-Datei, die eingebettete Metadatenblöcke und Metadatenelemente enthält.

JPEG-Bild mit Bewertungsmetadaten

In diesem Beispielbild werden die Metadaten in die Bilddatei in einem Bildrahmen eingebettet. Das JPEG-Format unterstützt nicht mehrere Bildframes, sodass die Metadaten konzeptionell an diesen einzelnen Frame angefügt werden. Bei Formaten, die mehrere Frames unterstützen, z. B. TIFF, sind möglicherweise Metadaten an jeden Bildrahmen angefügt, wie in diesem Diagramm dargestellt. Obwohl es heute nicht üblich ist und von den nativen Bildcodecs nicht unterstützt wird, unterstützen einige Bildformate möglicherweise auch Metadaten außerhalb eines Bildframes. WIC ist flexibel genug, um Sowohl Metadaten auf Frameebene als auch Metadaten außerhalb des einzelnen Frames eines Bilds zu verarbeiten.

Lesen von Bildmetadaten

Die WIC-APIs stellen COM-Komponenten bereit, die Anwendungen das Lesen und Schreiben von Bildmetadaten erleichtern.

Die primäre Möglichkeit zum Lesen von Metadaten besteht darin, einen Metadatenabfrageleser (IWICMetadataQueryReader) für den Zugriff auf bestimmte Metadatenelemente zu verwenden. Die Komponente des Metadatenabfragelesers wird vom Codec implementiert und kann auf Decoderebene oder über einzelne Bildframes zugegriffen werden, was die gängigere Methode ist. Der folgende Code veranschaulicht, wie Sie mithilfe der GetMetadataQueryReader-Methode des Abfragelesers auf einen Abfrageleser für einen einzelnen Frame zugreifen.

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

Ein Abfrageleseprogramm bietet Methoden zum Abrufen von Informationen zu bestimmten Metadaten sowie ein Mittel zum Angeben eines abzurufenden Metadatenelements. Der folgende Code verwendet einen Abfrageausdruck, um ein bestimmtes Metadatenelement innerhalb des IFD-Blocks (Geschachtelte Bilddateiverzeichnis) von App1 anzufordern. Dies erfolgt mithilfe der GetMetadataByName-Methode des Abfragelesers. Der folgende Code veranschaulicht die Verwendung des Abfragelesers zum Abrufen des MicrosoftPhoto-Bewertungswerts.

PROPVARIANT value;
PropVariantInit(&value);

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

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

Die Variable pwzRatingQuery im vorherigen Beispiel ist die Abfragezeichenfolge für den Zugriff auf das Metadatenelement MicrosoftPhoto-Bewertung. Diese Zeichenfolge wird mithilfe der Metadatenabfragesprache erstellt. Um diese Zeichenfolge zu erstellen, sind Kenntnisse des Metadatenformats und der Metadatenabfragesprache erforderlich, um einzelne Metadatenelemente abzurufen. Weitere Informationen zur Metadatenabfragesprache finden Sie unter Übersicht über die Metadatenabfragesprache.

Im Hintergrund verwendet ein Abfrageleser einen Metadatenleser (IWICMetadataReader), um auf die Metadaten zuzugreifen, die durch den Abfrageausdruck beschrieben werden. Zusätzlich zur Verwendung eines Abfragelesers können Sie auch direkt auf einen Metadatenleser zugreifen, um Metadaten zu lesen. Sie können einen Metadatenleser vom Decoder oder einzelnen Frames abrufen, indem Sie eine Blockleseschnittstelle (IWICMetadataBlockReader) abfragen.

Schreiben von Bildmetadaten

Der Prozess zum Schreiben von Metadaten ähnelt der Art und Weise, wie sie gelesen werden, mit der Ausnahme, dass ein Metadatenabfrage-Writer (IWICMetadataQueryWriter) verwendet wird. Die Abfrage-Writer-Schnittstelle wird vom Bildencoder implementiert, und wie beim Abfrageleser wird sowohl auf dem Encoder als auch auf einzelne Frames zugegriffen (abhängig von der Bildformatunterstützung).

Der folgende Code veranschaulicht, wie Sie einen Abfragewriter aus einem Encoderframe abrufen und den zuvor gelesenen Bewertungswert entfernen.

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

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

Eine weitere Möglichkeit zum Schreiben von Metadaten sind schnelle Metadatenupdates. Die schnelle Metadatencodierung ist eine Möglichkeit, Bildmetadaten zu schreiben, ohne eine Bilddatei neu codieren zu müssen. Dazu werden neue Metadateninformationen in einen aufgefüllten Bereich des Metadatenformats geschrieben. Der schnelle Metadatenencoder (IWICFastMetadataEncoder) wird basierend auf dem Bilddecoder aus der Komponentenfactory abgerufen. Der schnelle Metadatenencoder ruft dann einen Abfrage-Writer ab, der zum Schreiben der Metadaten verwendet wird. Schließlich committet der schnelle Encoder die Änderung.

Der folgende Code veranschaulicht, wie Ein schneller Metadatenencoder abgerufen und zum Schreiben des MicrosoftRating-Werts verwendet wird.

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

Nicht alle Metadatenformate unterstützen schnelle Metadaten. Informationen dazu, welche nativ unterstützten Formate die schnelle Metadatencodierung unterstützen, finden Sie in der Tabelle im Abschnitt Unterstützte Metadatenformate weiter unten in diesem Dokument.

Hinter den Kulissen verwendet ein Abfrage-Writer einen Metadaten-Writer (IWICMetadataWriter), um die durch den Abfrageausdruck beschriebenen Metadaten zu schreiben. Zusätzlich zur Verwendung eines Abfragelesers können Sie auch direkt auf einen Metadaten-Writer zugreifen, um Metadaten zu schreiben. Sie können einen Metadaten-Writer vom Decoder oder einzelnen Frames abrufen, indem Sie eine Block writer-Schnittstelle (IWICMetadataBlockWriter) abfragen.

Metadatenerweiterbarkeit

Wie bereits erwähnt, stellt WIC mehrere Metadatenhandler zum Lesen und Schreiben von Metadaten für gängige Metadatenformate bereit. Es gibt jedoch einige Metadatenformate, die nicht nativ unterstützt werden. Daher stellt WIC APIs zum Erstellen zusätzlicher Metadatenhandler bereit, die die Metadatenunterstützung auf andere Formate erweitern können.

Um andere Metadatenformate vollständig zu unterstützen, müssen zwei Typen von Handlern entwickelt werden: ein Metadatenleser zum Lesen von Metadaten und ein Metadaten-Writer zum Schreiben von Metadaten. Obwohl diese beiden Handler in der Regel in Paaren für ein bestimmtes Format implementiert werden, ist dies keine Voraussetzung. Es kann vorkommen, dass nur die Lesefähigkeit oder nur die Schreibfähigkeit benötigt wird.

Weitere Informationen zur Erweiterbarkeit von Metadaten mithilfe der WIC-APIs finden Sie in der Übersicht über die Metadatenerweiterbarkeit.

Unterstützte Metadatenformate

WIC bietet Unterstützung für mehrere gängige Metadatenformate. In der folgenden Tabelle sind die unterstützten Metadatenformate, deren Versionen, die Bildformate aufgeführt, die das Metadatenformat unterstützen, und ob das Metadatenformat die schnelle Metadatencodierung unterstützt. Weitere Informationen zur schnellen Metadatencodierung finden Sie weiter oben in diesem Dokument im Abschnitt Schreiben von Bildmetadaten .

Unterstützte Metadatenformate Version der Metadatenspezifikation Unterstützung des Bildformats Unterstützt schnelle Metadatencodierung
App0 JFIF 1.02 JPEG Nein
App1 JFIF 1.02 JPEG, TIFF Nein
App13 Unbekannt JPEG, TIFF Nein
IFD TIFF 6.0 JPEG, TIFF Ja
IRB1 Unbekannt JPEG, TIFF Nein
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
Text PNG 1.2 PNG Nein

 

Hinweis

IPTC unterstützt FME nur, wenn die Blöcke größer werden, da IPTC das Auffüllen nicht unterstützt.

 

Metadatenkomponentenzusammenfassung

In der folgenden Tabelle werden die WIC-Schnittstellen, die Metadaten unterstützen, und die entsprechenden Komponenten beschrieben. Diese Komponenten ermöglichen den Zugriff auf die Metadaten eines Images. Weitere Informationen zu diesen Komponenten finden Sie in der Übersicht über die Windows-Bildverarbeitungskomponenten.

Komponente BESCHREIBUNG
Bitmap-Decoder (IWICBitmapDecoder)
  • Liest einen Bildstream und erzeugt eine verwendbare Bitmapquelle. Einem Containerformat zugeordnet, z. B. TIFF (Tagged Image File Format) oder Joint Photographic Experts Group (JPEG).
  • Implementiert eine IWICMetadataBlockReader-Schnittstelle , um alle Metadatenblöcke im Datenstrom des Decoders aufzulisten, die sich nicht in einem Frame befinden.
  • Macht einen Abfrageleser verfügbar, um die Metadaten zu lesen, die dem Bild zugeordnet sind, das sich nicht in einem Frame befindet.
Bitmapframedecodierung (IWICBitmapFrameDecode)
  • Greift auf einzelne Frames aus dem Vom Decoder gespeicherten Bilddatenstrom zu.
  • Implementiert eine IWICMetadataBlockReader-Schnittstelle , um alle Metadatenblöcke im Datenstrom des Frames aufzulisten.
  • Macht einen Abfrageleser verfügbar, um die dem Frame zugeordneten Metadaten mithilfe von Abfrageausdrücken zu lesen.
Bitmap Encoder (IWICBitmapEncoder)
  • Schreibt eine Bitmapquelle in einen Bildstream. Einem Containerformat wie TIFF oder JPEG zugeordnet.
  • Implementiert eine IWICMetadataBlockWriter-Schnittstelle , um eine Liste von Metadatenblöcken zu erstellen, die in den Datenstrom des Encoders geschrieben werden sollen.
  • Macht einen Abfrageschreiber verfügbar, um die dem Bild zugeordneten Metadaten mithilfe von Abfrageausdrücken zu schreiben.
Bitma-Framecodierung (IWICBitmapFrameEncode)
  • Erstellt einen Frame, der in den Vom Encoder gespeicherten Stream codiert wird.
  • Implementiert eine IWICMetadataBlockWriter-Schnittstelle , um eine Liste mit Metadatenblöcken zu erstellen, die in den Datenstrom des Frames geschrieben werden sollen.
  • Macht einen Abfrageschreiber verfügbar, um die dem Frame zugeordneten Metadaten mithilfe von Abfrageausdrücken zu schreiben.

 

In der folgenden Tabelle werden die WIC-Metadatenkomponenten beschrieben. Mit diesen Komponenten können Sie die Metadaten in einem Bild lesen und schreiben, das von den in der vorherigen Tabelle aufgeführten Komponenten verfügbar gemacht wird.

Komponente BESCHREIBUNG
Metadatenabfrageleser (IWICMetadataQueryReader)
  • Verwendet eine Abfragezeichenfolge und navigiert in der zugrunde liegenden Metadatenhierarchie, um Metadaten abzurufen.
Metadatenabfrageschreiber (IWICMetadataQueryWriter)
  • Verwendet eine Abfragezeichenfolge und navigiert in der zugrunde liegenden Metadatenhierarchie, um Metadaten abzurufen, festzulegen und zu entfernen.
Metadatenblockleser (IWICMetadataBlockReader)
  • Verwaltet eine schreibgeschützte Auflistung von IWICMetadataReader-Objekten am oberen Rand der Metadatenhierarchie und ermöglicht die Enumeration aller Metadatenblöcke.
  • Implementiert durch einen Bitmapdecoder und einen decodierten Bitmaprahmen.
  • Wird von Drittanbieterkomponentenentwicklern für benutzerdefinierte Codecs implementiert.
Metadatenblockwriter (IWICMetadataBlockWriter)
  • Verwaltet eine Lese- und Schreibauflistung von IWICMetadataWriter-Objekten am oberen Rand der Metadatenhierarchie.
  • Implementiert durch einen Bitmapencoder und eine Bitmapframecodierung.
  • Wird von Drittanbieterkomponentenentwicklern für benutzerdefinierte Codecs implementiert.
Metadatenleser (IWICMetadataReader)
  • Analysiert einen Metadatendatenstrom und verwaltet eine schreibgeschützte Auflistung der Metadatenelemente. Einem Metadatenformat wie EXIF, IFD und XMP zugeordnet.
  • Fungiert als Wörterbuch und gibt einen Wert zurück, wenn ein Format- und ID-Paar angegeben wird.
  • Wird von Drittanbieterkomponentenentwicklern für benutzerdefinierte Metadatentypen implementiert.
Metadaten-Writer (IWICMetadataWriter)
  • Analysiert und serialisiert einen Metadatendatenstrom und verwaltet eine Sammlung von Metadatenelementen mit Lese-/Schreibzugriff.
  • Wird von Drittanbieterkomponentenentwicklern für benutzerdefinierte Metadatentypen implementiert.
Fast Metadata EncoderIWICFastMetadataEncoder
  • Macht Semantik zum Schreiben in einer Metadatenhierarchie verfügbar, die Metadaten an Ort und Stelle aktualisiert, ohne das Image neu zu codieren.

 

Konzept

Übersicht über die Windows-Bildverarbeitungskomponente

Übersicht über die Metadaten-Abfragesprache

Übersicht über das Lesen und Schreiben von Bildmetadaten

Metadatenerweiterbarkeit – Übersicht

Vorgehensweise: Erneutes Codieren eines JPEG-Bilds mit Metadaten