Übersicht über die Metadatenerweiterbarkeit

In diesem Thema werden die Anforderungen zum Erstellen von benutzerdefinierten Metadatenhandlern für die Windows Imaging Component (WIC) vorgestellt, einschließlich Metadatenleser und Writern. Außerdem werden die Anforderungen für die Erweiterung der WIC-Laufzeitkomponentenermittlung um Ihre benutzerdefinierten Metadatenhandler erläutert.

Dieses Thema enthält folgende Abschnitte:

Voraussetzungen

Um dieses Thema zu verstehen, sollten Sie über ein umfassendes Verständnis von WIC, dessen Komponenten und Metadaten für Bilder verfügen. Weitere Informationen zu WIC-Metadaten finden Sie in der Übersicht über WIC-Metadaten. Weitere Informationen zu WIC-Komponenten finden Sie in der Übersicht über die Windows-Imageerstellungskomponente.

Einführung

Wie in der WIC-Metadatenübersicht erläutert, gibt es in einem Bild häufig mehrere Metadatenblöcke, von denen jeder verschiedene Arten von Informationen in verschiedenen Metadatenformaten verfügbar macht. Für die Interaktion mit einem Metadatenformat, das in ein Bild eingebettet ist, muss eine Anwendung einen geeigneten Metadatenhandler verwenden. WIC bietet mehrere Metadatenhandler (sowohl Metadatenleser als auch Writer), mit denen Sie bestimmte Metadatentypen wie Exif oder XMP lesen und schreiben können.

Zusätzlich zu den bereitgestellten nativen Handlern stellt WIC APIs bereit, mit denen Sie neue Metadatenhandler erstellen können, die an der Laufzeitkomponentenermittlung von WIC beteiligt sind. Dadurch können Anwendungen, die WIC verwenden, Ihre benutzerdefinierten Metadatenformate lesen und schreiben.

Mit den folgenden Schritten können Ihre Metadatenhandler an der Laufzeitmetadatenermittlung von WIC teilnehmen.

  • Implementieren Sie eine Metadatenlesehandlerklasse (IWICMetadataReader), die die erforderlichen WIC-Schnittstellen zum Lesen Ihres benutzerdefinierten Metadatenformats verfügbar macht. Dadurch können WIC-basierte Anwendungen Ihr Metadatenformat genauso lesen, wie sie native Metadatenformate lesen.
  • Implementieren Sie eine Metadata-Writer-Handlerklasse (IWICMetadataWriter), die die erforderlichen WIC-Schnittstellen zum Codieren Ihres benutzerdefinierten Metadatenformats verfügbar macht. Dadurch können WIC-basierte Anwendungen Ihr Metadatenformat in unterstützte Bildformate serialisieren.
  • Signieren und registrieren Sie Ihre Metadatenhandler digital. Dadurch können Ihre Metadatenhandler zur Laufzeit ermittelt werden, indem das Identifizierungsmuster in der Registrierung mit dem in die Imagedatei eingebetteten Muster abgegleicht wird.

Erstellen eines Metadatenlesers

Der Standard zugriff auf Metadatenblöcke innerhalb eines Codecs erfolgt über die IWICMetadataBlockReader-Schnittstelle, die jeder WIC-Codec implementiert. Diese Schnittstelle listet jeden der Metadatenblöcke auf, die in ein Bildformat eingebettet sind, sodass der entsprechende Metadatenhandler für jeden Block ermittelt und instanziiert werden kann. Die Metadatenblöcke, die von WIC nicht erkannt werden, gelten als unbekannt und werden als GUID-CLSID_WICUnknownMetadataReader definiert. Damit Ihr Metadatenformat von WIC erkannt wird, müssen Sie eine Klasse erstellen, die drei Schnittstellen implementiert: IWICMetadataReader, IWICPersistStream und IWICStreamProvider.

Hinweis

Wenn Ihr Metadatenformat Einschränkungen aufweist, die einige Methoden der erforderlichen Schnittstellen ungeeignet machen, sollten diese Methoden WINCODEC_ERR_UNSUPPORTEDOPERATION zurückgeben.

 

IWICMetadataReader-Schnittstelle

Die IWICMetadataReader-Schnittstelle muss beim Erstellen eines Metadatenlesers implementiert werden. Diese Schnittstelle bietet Zugriff auf die untergeordneten Metadatenelemente im Datenstrom eines Metadatenformats.

Der folgende Code zeigt die Definition der Metadatenleseschnittstelle, wie in der Datei wincodecsdk.idl definiert.

interface IWICMetadataReader : IUnknown
{
    HRESULT GetMetadataFormat(
        [out] GUID *pguidMetadataFormat
        );

    HRESULT GetMetadataHandlerInfo(
        [out] IWICMetadataHandlerInfo **ppIHandler
        );

    HRESULT GetCount(
        [out] UINT *pcCount
        );

    HRESULT GetValueByIndex(
        [in] UINT nIndex,
        [in, out, unique] PROPVARIANT *pvarSchema,
        [in, out, unique] PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetEnumerator(
        [out] IWICEnumMetadataItem **ppIEnumMetadata
        );
};

Die GetMetadataFormat-Methode gibt die GUID Ihres Metadatenformats zurück.

Die GetMetadataHandlerInfo-Methode gibt eine IWICMetadataHandlerInfo-Schnittstelle zurück, die Informationen zu Ihrem Metadatenhandler bereitstellt. Dies umfasst Informationen, z. B. welche Bildformate das Metadatenformat unterstützen und ob Ihr Metadatenleser Zugriff auf den vollständigen Metadatendatenstrom benötigt.

Die GetCount-Methode gibt die Anzahl der einzelnen Metadatenelemente (einschließlich eingebetteter Metadatenblöcke) zurück, die innerhalb des Metadatenstreams gefunden wurden.

Die GetValueByIndex-Methode gibt ein Metadatenelement anhand eines Indexwerts zurück. Mit dieser Methode können Anwendungen die einzelnen Metadatenelemente in einem Metadatenblock durchlaufen. Der folgende Code veranschaulicht, wie eine Anwendung diese Methode verwenden kann, um jedes Metadatenelement in einem Metadatenblock abzurufen.

PROPVARIANT readerValue;
IWICMetadataBlockReader *blockReader = NULL;
IWICMetadataReader *reader = NULL;

PropVariantInit(&readerValue);

hr = pFrameDecode->QueryInterface(IID_IWICMetadataBlockReader, (void**)&blockReader);

if (SUCCEEDED(hr))
{
    // Retrieve the third block in the image. This is image specific and
    // ideally you should call this by retrieving the reader count
    // first.
    hr = blockReader->GetReaderByIndex(2, &reader);
}

if (SUCCEEDED(hr))
{
    UINT numValues = 0;

    hr = reader->GetCount(&numValues);

    // Loop through each item and retrieve by index
    for (UINT i = 0; SUCCEEDED(hr) && i < numValues; i++)
    {
        PROPVARIANT id, value;

        PropVariantInit(&id);
        PropVariantInit(&value);

        hr = reader->GetValueByIndex(i, NULL, &id, &value);

        if (SUCCEEDED(hr))
        {
            // Do something with the metadata item.
            //...
        }
        PropVariantClear(&id);
        PropVariantClear(&value);
    }               
}

Die GetValue-Methode ruft ein bestimmtes Metadatenelement nach Schema und/oder ID ab. Diese Methode ähnelt der GetValueByIndex-Methode , mit der Ausnahme, dass sie ein Metadatenelement mit einem bestimmten Schema oder einer bestimmten ID abruft.

Die GetEnumerator-Methode gibt einen Enumerator jedes Metadatenelements im Metadatenblock zurück. Dadurch können Anwendungen einen Enumerator verwenden, um in Ihrem Metadatenformat zu navigieren.

Wenn Ihr Metadatenformat keinen Begriff von Schemas für Metadatenelemente aufweist, wird getValue... -Methoden sollten diese Eigenschaft ignorieren. Wenn Ihr Format jedoch Schemabenennung unterstützt, sollten Sie mit einem NULL-Wert rechnen.

Wenn ein Metadatenelement ein eingebetteter Metadatenblock ist, erstellen Sie einen Metadatenhandler aus dem Teilstream des eingebetteten Inhalts, und geben Sie den neuen Metadatenhandler zurück. Wenn kein Metadatenleser für den geschachtelten Block verfügbar ist, instanziieren Und zurückgeben Sie einen unbekannten Metadatenleser. Um einen neuen Metadatenleser für den eingebetteten Block zu erstellen, rufen Sie die CreateMetadataReaderFromContainer - oder CreateMetadataReader-Methoden der Komponentenfactory auf, oder rufen Sie die WICMatchMetadataContent-Funktion auf.

Wenn der Metadatenstream Big-Endian-Inhalt enthält, ist der Metadatenleser für den Austausch aller verarbeiteten Datenwerte verantwortlich. Es ist auch dafür verantwortlich, alle geschachtelten Metadatenleser darüber zu informieren, dass sie mit dem Big-Endian-Datenstrom arbeiten. Alle Werte sollten jedoch im Little-Endian-Format zurückgegeben werden.

Implementieren Sie die Unterstützung für die Namespacenavigation, indem Sie Abfragen unterstützen, bei denen die Metadatenelement-ID eine VT_CLSID (GUID) ist, die einem Metadatenformat entspricht. Wenn während der Analyse ein geschachtelter Metadatenleser für dieses Format identifiziert wird, muss er zurückgegeben werden. Dadurch können Anwendungen einen Metadatenabfrageleser verwenden, um Ihr Metadatenformat zu durchsuchen.

Wenn Sie ein Metadatenelement nach ID abrufen, sollten Sie die PropVariantChangeType-Funktion verwenden, um die ID in den erwarteten Typ zu integrieren. Der IFD-Reader erzisiert z. B. eine ID zur Eingabe VT_UI2 , damit sie mit dem Datentyp einer IFD-Tag-ID USHORT übereinstimmt. Der Eingabetyp und der erwartete Typ müssen propvariant sein, um dies zu tun. Dies ist nicht erforderlich, aber durch diesen Zwang wird Code vereinfacht, der den Reader aufruft, metadatenelemente abzufragen.

IWICPersistStream-Schnittstelle

Die IWICPersistStream-Schnittstelle erbt von IPersistStream und stellt zusätzliche Methoden zum Speichern und Laden von Objekten mithilfe der WICPersistOptions-Enumeration bereit .

Der folgende Code zeigt die Definition der IWICPersistStream-Schnittstelle , wie in der Datei wincodecsdk.idl definiert.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

Die LoadEx-Methode stellt Ihrem Metadatenleser einen Datenstrom bereit, der Ihren Metadatenblock enthält. Ihr Leser analysiert diesen Stream, um auf die zugrunde liegenden Metadatenelemente zuzugreifen. Ihr Metadatenleser wird mit einem Teilstream initialisiert, der am Anfang des Rohmetadateninhalts positioniert ist. Wenn Ihr Reader nicht den vollständigen Stream benötigt, ist der Teilstream im Bereich auf den Inhalt des Metadatenblocks beschränkt. Andernfalls wird der vollständige Metadatenstream mit der position bereitgestellt, die am Anfang des Metadatenblocks festgelegt ist.

Die SaveEx-Methode wird von Metadatenautoren verwendet, um Ihren Metadatenblock zu serialisieren. Wenn SaveEx in einem Metadatenleser verwendet wird, sollte WINCODEC_ERR_UNSUPPORTEDOPERATION zurückgegeben werden.

IWICStreamProvider-Schnittstelle

Die IWICStreamProvider-Schnittstelle ermöglicht es Ihrem Metadatenleser, Verweise auf seinen Inhaltsdatenstrom bereitzustellen, Informationen zum Stream bereitzustellen und zwischengespeicherte Versionen des Datenstroms zu aktualisieren.

Der folgende Code zeigt die Definition der IWICStreamProvider-Schnittstelle , wie in der Datei wincodecsdk.idl definiert.

interface IWICStreamProvider : IUnknown
{
    HRESULT GetStream(
        [out] IStream **ppIStream
        );

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

Die GetStream-Methode ruft einen Verweis auf Ihren Metadatendatenstrom ab. Für den zurückgegebenen Stream sollte der Streamzeiger auf die Startposition zurückgesetzt werden. Wenn ihr Metadatenformat vollständigen Streamzugriff erfordert, sollte die Startposition der Anfang des Metadatenblocks sein.

Die GetPersistOptions-Methode gibt die aktuellen Optionen des Datenstroms aus der WICPersistOptions-Enumeration zurück.

Die GetPreferredVendorGUID-Methode gibt die GUID des Anbieters des Metadatenlesers zurück.

Die RefreshStream-Methode aktualisiert den Metadatendatenstrom. Diese Methode muss LoadEx mit einem NULL-Stream für alle geschachtelten Metadatenblöcke aufrufen. Dies ist erforderlich, da geschachtelte Metadatenblöcke und deren Elemente aufgrund der direkten Bearbeitung möglicherweise nicht mehr vorhanden sind.

Erstellen eines Metadaten-Writers

Ein Metadaten-Writer ist ein Metadatenhandlertyp, der eine Möglichkeit bietet, einen Metadatenblock in einen Bildrahmen oder außerhalb eines einzelnen Frames zu serialisieren, wenn das Bildformat dies unterstützt. Der Standard Zugriff auf die Metadatenschreiber innerhalb eines Codecs erfolgt über die IWICMetadataBlockWriter-Schnittstelle, die jeder WIC-Encoder implementiert. Mit dieser Schnittstelle können Anwendungen jeden in einem Bild eingebetteten Metadatenblöcke auflisten, sodass der entsprechende Metadatenschreiber für jeden Metadatenblock ermittelt und instanziiert werden kann. Metadatenblöcke ohne entsprechenden Metadatenschreiber gelten als unbekannt und werden als GUID-CLSID_WICUnknownMetadataReader definiert. Damit WIC-fähige Anwendungen Ihr Metadatenformat serialisieren und schreiben können, müssen Sie eine Klasse erstellen, die die folgenden Schnittstellen implementiert: IWICMetadataWriter, IWICMetadataReader, IWICPersistStream und IWICStreamProvider.

Hinweis

Wenn Ihr Metadatenformat Einschränkungen aufweist, die einige Methoden der erforderlichen Schnittstellen unangemessen machen, sollten diese Methoden WINCODEC_ERR_UNSUPPORTEDOPERATION zurückgeben.

 

IWICMetadataWriter-Schnittstelle

Die IWICMetadataWriter-Schnittstelle muss von Ihrem Metadatenschreiber implementiert werden. Da IWICMetadataWriter von IWICMetadataReader erbt, müssen Sie außerdem alle Methoden von IWICMetadataReader implementieren. Da beide Handlertypen dieselbe Schnittstellenvererbung erfordern, können Sie eine einzelne Klasse erstellen, die sowohl Lese- als auch Schreibfunktionen bietet.

Der folgende Code zeigt die Definition der Metadaten-Writer-Schnittstelle, wie sie in der Datei wincodecsdk.idl definiert ist.

interface IWICMetadataWriter : IWICMetadataReader
{
    HRESULT SetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT SetValueByIndex(
        [in] UINT nIndex,
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT RemoveValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId
        );

    HRESULT RemoveValueByIndex(
        [in] UINT nIndex
        );
};

Die SetValue-Methode schreibt das angegebene Metadatenelement in den Metadatenstream.

Die SetValueByIndex-Methode schreibt das angegebene Metadatenelement in den angegebenen Index im Metadatenstream. Der Index bezieht sich nicht auf die ID, sondern auf die Position des Elements im Metadatenblock.

Die RemoveValue-Methode entfernt das angegebene Metadatenelement aus dem Metadatenstream.

Die RemoveValueByIndex-Methode entfernt das Metadatenelement am angegebenen Index aus dem Metadatenstream. Nach dem Entfernen eines Elements wird erwartet, dass die verbleibenden Metadatenelemente den leeren Index belegen, wenn der Index nicht der letzte Index ist. Es wird auch erwartet, dass sich die Anzahl ändert, nachdem das Element entfernt wurde.

Es liegt in der Verantwortung des Metadatenautors, die PROPVARIANT-Elemente in die zugrunde liegende Struktur zu konvertieren, die für Ihr Format erforderlich ist. Im Gegensatz zum Metadatenleser sollten VARIANT-Typen jedoch normalerweise nicht zu unterschiedlichen Typen geerct werden, da der Aufrufer speziell angibt, welcher Datentyp verwendet werden soll.

Ihr Metadatenschreiber muss alle Metadatenelemente in den Bilddatenstrom committen, einschließlich ausgeblendeter oder nicht erkannter Werte. Dazu gehören unbekannte geschachtelte Metadatenblöcke. Es liegt jedoch in der Verantwortung des Encoders, alle wichtigen Metadatenelemente festzulegen, bevor der Speichervorgang initiiert wird.

Wenn der Metadatenstream Big-Endian-Inhalte enthält, ist der Metadatenschreiber für den Austausch aller verarbeiteten Datenwerte verantwortlich. Es ist auch dafür verantwortlich, alle geschachtelten Metadatenautoren darüber zu informieren, dass sie beim Speichern mit einem Big-End-Datenstrom arbeiten.

Implementieren Sie die Unterstützung für das Erstellen und Entfernen von Namespaces, indem Sie Set- und Remove-Vorgänge für Metadatenelemente mit einem Typ von (einer GUID) unterstützen, der VT_CLSID einem Metadatenformat entspricht. Der Metadatenschreiber ruft die WICSerializeMetadataContent-Funktion auf, um den Inhalt des geschachtelten Metadatenschreibers ordnungsgemäß in den übergeordneten Metadatenschreiber einzubetten.

Wenn Ihr Metadatenformat die direkte Codierung unterstützt, sind Sie für die Verwaltung des erforderlichen Abstands verantwortlich. Weitere Informationen zur direkten Codierung finden Sie unter Übersicht über WIC-Metadaten und Übersicht über Das Lesen und Schreiben von Bildmetadaten.

IWICPersistStream-Schnittstelle

Die IWICPersistStream-Schnittstelle erbt von IPersistStream und stellt zusätzliche Methoden zum Speichern und Laden von Objekten mithilfe der WICPersistOptions-Enumeration bereit.

Der folgende Code zeigt die Definition der IWICPersistStream-Schnittstelle , die in der Datei wincodecsdk.idl definiert ist.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

Die LoadEx-Methode stellt Ihrem Metadatenhandler einen Datenstrom mit Ihrem Metadatenblock bereit.

Die SaveEx-Methode serialisiert die Metadaten in einen Stream. Wenn der bereitgestellte Stream mit dem Initialisierungsstream identisch ist, sollten Sie die direkte Codierung durchführen. Wenn die direkte Codierung unterstützt wird, sollte diese Methode WINCODEC_ERR_TOOMUCHMETADATA zurückgeben, wenn die Auffüllung nicht ausreicht, um die direkte Codierung durchzuführen. Wenn die direkte Codierung nicht unterstützt wird, sollte diese Methode WINCODEC_ERR_UNSUPPORTEDOPERATION zurückgeben.

Die IPersistStream::GetSizeMax-Methode muss implementiert werden und muss die genaue Größe des Metadateninhalts zurückgeben, der beim nachfolgenden Speichern geschrieben wird.

Die IPersistStream::IsDirty-Methode sollte implementiert werden, wenn der Metadatenschreiber über einen Stream initialisiert wird, damit ein Bild zuverlässig feststellen kann, ob sich sein Inhalt geändert hat.

Wenn Ihr Metadatenformat geschachtelte Metadatenblöcke unterstützt, sollte Ihr Metadatenschreiber beim Speichern in einem Stream die Serialisierung des Inhalts an die geschachtelten Metadatenschreiber delegieren.

IWICStreamProvider-Schnittstelle

Die Implementierung der IWICStreamProvider-Schnittstelle für einen Metadatenschreiber ist identisch mit der eines Metadatenlesers. Weitere Informationen finden Sie im Abschnitt Erstellen eines Metadatenlesers in diesem Dokument.

Installieren und Registrieren eines Metadatenhandlers

Zum Installieren eines Metadatenhandlers müssen Sie die Handlerassembly bereitstellen und in der Systemregistrierung registrieren. Sie können entscheiden, wie und wann die Registrierungsschlüssel aufgefüllt werden.

Hinweis

Aus Gründen der Lesbarkeit werden die tatsächlichen hexadezimalen GUIDs in den Registrierungsschlüsseln in den folgenden Abschnitten dieses Dokuments nicht angezeigt. Den Hexadezimalwert für einen angegebenen Anzeigenamen finden Sie in den Dateien wincodec.idl und wincodecsdk.idl.

 

Metadatenhandlerregistrierungsschlüssel

Jeder Metadatenhandler wird durch eine eindeutige CLSID identifiziert, und jeder Handler ist erforderlich, um seine CLSID unter der Kategorie-ID-GUID des Metadatenhandlers zu registrieren. Die Kategorie-ID jedes Handlertyps ist in wincodec.idl definiert. Der Kategorie-ID-Name für Leser ist CATID_WICMetadataReader, und der Kategorie-ID-Name für Autoren ist CATID_WICMetadataWriter.

Jeder Metadatenhandler wird durch eine eindeutige CLSID identifiziert, und jeder Handler ist erforderlich, um seine CLSID unter der Kategorie-ID-GUID des Metadatenhandlers zu registrieren. Die Kategorie-ID jedes Handlertyps ist in wincodec.idl definiert. Der Kategorie-ID-Name für Leser ist CATID_WICMetadataReader, und der Kategorie-ID-Name für Autoren ist CATID_WICMetadataWriter.

Hinweis

In den folgenden Registrierungsschlüssellisten bezieht sich {Reader CLSID} auf die eindeutige CLSID, die Sie für Ihren Metadatenleser bereitstellen. {Writer CLSID} bezieht sich auf die eindeutige CLSID, die Sie für Ihren Metadatenschreiber bereitstellen. {Handler CLSID} bezieht sich auf die CLSID des Lesers, die CLSID des Schreibers oder beides, je nachdem, welche Handler Sie bereitstellen. {Container GUID} bezieht sich auf das Containerobjekt (Bildformat oder Metadatenformat), das den Metadatenblock enthalten kann.

 

Die folgenden Registrierungsschlüssel registrieren Ihren Metadatenhandler mit den anderen verfügbaren Metadatenhandlern:

[HKEY_CLASSES_ROOT\CLSID\{CATID_WICMetadataReaders}\Instance\{Reader CLSID}]
CLSID={Reader CLSID}
Friendly Name="Reader Name"

[HKEY_CLASSES_ROOT\CLSID\{CATID_ WICMetadataWriters}\Instance\{Writer CLSID}]
CLSID={Writer CLSID}
Friendly Name="Writer Name"

Zusätzlich zum Registrieren Ihrer Handler in ihren jeweiligen Kategorien müssen Sie auch zusätzliche Schlüssel registrieren, die spezifische Informationen für den Handler bereitstellen. Leser und Autoren haben ähnliche Registrierungsschlüsselanforderungen. Die folgende Syntax zeigt, wie sie einen Handler registrieren. Sowohl der Leserhandler als auch der Writer-Handler müssen auf diese Weise registriert werden, wobei die jeweiligen CLSIDs verwendet werden:

[HKEY_CLASSES_ROOT\CLSID\{CLSID}]
"Vendor"={VendorGUID}
"Date"="yyyy-mm-dd"
"Version"="Major.Minor.Build.Number"
"SpecVersion"="Major.Minor.Build.Number"
"MetadataFormat"={MetadataFormatGUID}
"RequiresFullStream"=dword:1|0
"SupportsPadding"= dword:1|0
"FixedSize"=0

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InProcServer32]
@="drive:\path\yourdll.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\{LCID}]
Author="Author's Name"
Description = " Metadata Description"
DeviceManufacturer ="Manufacturer Name"
DeviceModels="Device,Device"
FriendlyName="Friendly Name"

Metadatenleser

Die Metadatenleserregistrierung enthält auch Schlüssel, die beschreiben, wie der Reader in ein Containerformat eingebettet werden kann. Ein Containerformat kann ein Bildformat wie TIFF oder JPEG sein. es kann sich auch um ein anderes Metadatenformat wie ein IFD-Metadatenblock sein. Nativ unterstützte Imagecontainerformate sind in wincodec.idl aufgeführt. Jedes Imagecontainerformat wird als GUID mit einem Namen definiert, der mit GUID_ContainerFormat beginnt. Nativ unterstützte Metadatencontainerformate sind in wincodecsdk.idl aufgeführt. jedes Metadatencontainerformat wird als GUID mit einem Namen definiert, der mit GUID_MetadataFormat beginnt.

Die folgenden Schlüssel registrieren einen Container, den der Metadatenleser unterstützt, und die Daten, die zum Lesen aus diesem Container erforderlich sind. Jeder vom Reader unterstützte Container muss auf diese Weise registriert werden.

[HKEY_CLASSES_ROOT\CLSID\{Reader CLSID}\Containers\{Container GUID}\0]
"Position"=dword:00000000
"Pattern"=hex:ff,ff,ff,...
"Mask"=hex:ff,ff,ff,...
"DataOffset"=dword:00000006

Der Pattern-Schlüssel beschreibt das binäre Muster, das verwendet wird, um den Metadatenblock mit dem Leser abzugleichen. Beim Definieren eines Musters für Ihren Metadatenleser sollte es zuverlässig genug sein, dass eine positive Übereinstimmung bedeutet, dass der Metadatenleser die Metadaten im verarbeiteten Metadatenblock verstehen kann.

Der DataOffset-Schlüssel beschreibt den festen Offset der Metadaten aus dem Blockheader. Dieser Schlüssel ist optional und bedeutet, wenn nicht angegeben, dass die tatsächlichen Metadaten nicht mithilfe eines festen Offsets aus dem Blockheader gefunden werden können.

Metadaten-Writer

Die Metadatenschreiberregistrierung enthält auch Schlüssel, die beschreiben, wie der Header vor dem Metadateninhalt in ein Containerformat eingebettet wird. Wie beim Reader kann ein Containerformat ein Bildformat oder ein anderer Metadatenblock sein.

Die folgenden Schlüssel registrieren einen Container, den der Metadaten-Writer unterstützt, und die Daten, die zum Schreiben des Headers und der Metadaten erforderlich sind. Jeder vom Writer unterstützte Container muss auf diese Weise registriert werden.

[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000

Der WriteHeader-Schlüssel beschreibt das binäre Muster des zu schreibenden Metadatenblockheaders. Dieses binäre Muster fällt mit dem Leseschlüssel Muster des Metadatenformats zusammen.

Der WriteOffset-Schlüssel beschreibt den festen Offset aus dem Blockheader, an dem die Metadaten geschrieben werden sollen. Dieser Schlüssel ist optional und bedeutet, wenn er nicht angegeben wird, dass die tatsächlichen Metadaten nicht mit dem Header geschrieben werden sollten.

Signieren eines Metadatenhandlers

Alle Metadatenhandler müssen digital signiert sein, um am WIC-Ermittlungsprozess teilzunehmen. WIC lädt keinen Handler, der nicht von einer vertrauenswürdigen Zertifizierungsstelle signiert ist. Weitere Informationen zur digitalen Signatur finden Sie unter Einführung in die Codesignatur.

Besondere Überlegungen

Die folgenden Abschnitte enthalten zusätzliche Informationen, die Sie beim Erstellen eigener Metadatenhandler berücksichtigen müssen.

PROPVARIANTEN

WIC verwendet eine PROPVARIANT , um ein Metadatenelement zum Lesen und Schreiben darzustellen. Ein PROPVARIANT stellt einen Datentyp und Einen Datenwert für ein Metadatenelement bereit, das innerhalb eines Metadatenformats verwendet wird. Als Writer eines Metadatenhandlers haben Sie viel Flexibilität in Bezug darauf, wie Daten im Metadatenformat gespeichert werden und wie Daten in einem Metadatenblock dargestellt werden. Die folgende Tabelle enthält Richtlinien, die Ihnen bei der Entscheidung für den geeigneten PROPVARIANT-Typ helfen, der in verschiedenen Situationen verwendet werden soll.

Metadatentyp ist... Verwenden des PROPVARIANT-Typs PROPVARIANT-Eigenschaft
Leer oder nicht vorhanden. VT_EMPTY Nicht zutreffend
Nicht definiert. VT_BLOB Verwenden Sie die blob-Eigenschaft, um die Größe und den Zeiger auf das BLOB-Objekt festzulegen, das mit CoTaskMemAlloc zugeordnet ist.
Ein Metadatenblock. VT_UNKNOWN Dieser Typ verwendet die punkVal-Eigenschaft.
Ein Array von Typen. VT_VECTOR | VT_{type} Verwenden Sie die ca{type}-Eigenschaft, um die Anzahl und den Zeiger auf das Array festzulegen, das mit CoTaskMemAlloc zugeordnet ist.
Ein Array von Metadatenblöcken. VT_VECTOR | VT_VARIANT Verwenden Sie die capropvar-Eigenschaft, um das Array von Varianten festzulegen.
Ein rationaler Wert mit Vorzeichen. VT_I8 Verwenden Sie die hVal-Eigenschaft, um den Wert festzulegen. Legen Sie das hohe Wort auf den Nenner und das niedrige Wort auf den Zähler fest.
Ein rationaler Wert. VT_UI8 Verwenden Sie die uhVal-Eigenschaft, um den Wert festzulegen. Legen Sie highPart auf den Nenner und LowPart auf den Zähler fest. Beachten Sie, dass lowPart ein unsigned int ist. Der Zähler sollte von einem nicht signierten int in ein int konvertiert werden, um sicherzustellen, dass das Zeichenbit beibehalten wird, falls vorhanden.

 

Verwenden Sie keine sicheren Arrays, um Redundanz bei der Darstellung von Arrayelementen zu vermeiden. nur einfache Arrays verwenden. Dies reduziert die Arbeit, die eine Anwendung beim Interpretieren von PROPVARIANT-Typen ausführen muss.

Vermeiden Sie es, Werte nach Möglichkeit inline zu verwenden VT_BYREF und zu speichern. VT_BYREF ist für kleine Typen (häufig für Metadatenelemente) ineffizient und stellt keine Größeninformationen bereit.

Rufen Sie vor der Verwendung von PROPVARIANT immer PropVariantInit auf, um den Wert zu initialisieren. Wenn Sie mit PROPVARIANT fertig sind, rufen Sie immer PropVariantClear auf, um den für die Variable zugeordneten Arbeitsspeicher freizugeben.

8BIM-Handler

Beim Schreiben eines Metadatenhandlers für einen 8BIM-Metadatenblock müssen Sie eine Signatur verwenden, die sowohl die 8BIM-Signatur als auch die ID kapselt. Der native 8BIMIPTC-Metadatenleser stellt beispielsweise die folgenden Registrierungsinformationen für die Leserermittlung bereit:

[HKEY_CLASSES_ROOT\CLSID\{0010668C-0801-4DA6-A4A4-826522B6D28F}\Containers\{16100D66-8570-4BB9-B92D-FDA4B23ECE67}\0]
"Position"=dword:00000000
"Pattern"=hex:38,42,49,4d,04,04
"Mask"=hex:ff,ff,ff,ff,ff,ff
"DataOffset"=dword:00000006

Der 8BIMIPTC-Reader verfügt über ein registriertes Muster aus 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. Die ersten vier Bytes (0x38, 0x42, 0x49, 0x4D) sind die 8BIM-Signatur und die letzten beiden Bytes (0x04, 0x04) sind die ID für den IPTC-Eintrag.

Um also einen 8BIM-Metadatenleser für Auflösungsinformationen zu schreiben, benötigen Sie ein registriertes Muster aus 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. Auch hier sind die ersten vier Bytes (0x38, 0x42, 0x49, 0x4D) die 8BIM-Signatur. Die letzten beiden Bytes (0x03, 0xED) sind jedoch die Auflösungsinformations-ID, wie im PSD-Format definiert.

Konzept

Übersicht über die Windows-Imageerstellungskomponente

Übersicht über WIC-Metadaten

Übersicht über die Metadaten-Abfragesprache

Übersicht über das Lesen und Schreiben von Bildmetadaten

Vorgehensweise: Erneutes Codieren eines JPEG-Bilds mit Metadaten

Andere Ressourcen

Schreiben eines WIC-Enabled CODEC