Udostępnij za pośrednictwem


Omówienie rozszerzalności metadanych

W tym temacie przedstawiono wymagania dotyczące tworzenia niestandardowych menedżerów metadanych dla Windows Imaging Component (WIC), w tym czytników i zapisujących metadanych. Zawiera również omówienie wymagań dotyczących rozszerzania procesu odnajdywania komponentów w czasie wykonywania WIC, aby uwzględnić niestandardowe obsługiwacze metadanych.

Ten temat zawiera następujące sekcje.

Warunki wstępne

Aby zrozumieć ten temat, musisz mieć dogłębną wiedzę na temat funkcji WIC, jej składników i metadanych dla obrazów. Aby uzyskać więcej informacji na temat metadanych WIC, zobacz Omówienie metadanych WIC. Aby uzyskać więcej informacji na temat składników WIC, zobacz Windows Imaging Component Overview.

Wprowadzenie

Jak omówiono w Przegląd metadanych WIC, w obrazie często znajduje się wiele bloków metadanych, z których każdy blok ujawnia różne rodzaje informacji w różnych formatach metadanych. Aby wchodzić w interakcje z formatem metadanych osadzonym na obrazie, aplikacja musi używać odpowiedniej procedury obsługi metadanych. WIC udostępnia kilka procedur obsługi metadanych (zarówno czytników, jak i zapisujących), które umożliwiają odczytywanie i zapisywanie określonych typów metadanych, takich jak Exif lub XMP.

Oprócz dostarczonych natywnych procedur obsługi, usługa WIC udostępnia interfejsy API, które umożliwiają tworzenie nowych procedur obsługi metadanych, uczestniczących w odnajdywaniu składników uruchomieniowych WIC. Umożliwia to aplikacjom korzystającym z funkcji WIC odczytywanie i zapisywanie niestandardowych formatów metadanych.

Poniższe kroki umożliwiają obsługom metadanych uczestniczenie w odkrywaniu metadanych podczas działania WIC.

  • Zaimplementuj klasę obsługi czytnika metadanych (IWICMetadataReader), która uwidacznia wymagane interfejsy WIC do odczytywania niestandardowego formatu metadanych. Dzięki temu aplikacje oparte na protokole WIC odczytują metadane w taki sam sposób, jak odczytują natywne formaty metadanych.
  • Zaimplementuj klasę obsługi zapisywania metadanych (IWICMetadataWriter), która udostępnia wymagane interfejsy WIC do kodowania własnego formatu metadanych. Dzięki temu aplikacje oparte na WIC mogą serializować format metadanych do obsługiwanych formatów obrazów.
  • Cyfrowo podpisz i zarejestruj programy obsługujące metadane. Dzięki temu programy obsługi metadanych mogą być wykrywane w czasie wykonywania przez dopasowanie wzorca identyfikującego w rejestrze ze wzorcem osadzonym w pliku obrazu.

Tworzenie czytnika metadanych

Główny dostęp do bloków metadanych w kodeku jest przez interfejsu IWICMetadataBlockReader, który implementuje każdy kodek WIC. Ten interfejs wylicza każdy blok metadanych osadzony w formacie obrazu, dzięki czemu można odnaleźć i utworzyć odpowiedni program obsługi metadanych dla każdego bloku. Bloki metadanych, które nie są rozpoznawane przez WIC, uznaje się za nieznane i definiuje jako identyfikator GUID CLSID_WICUnknownMetadataReader. Aby format metadanych był rozpoznawany przez usługę WIC, należy utworzyć klasę, która implementuje trzy interfejsy: IWICMetadataReader, IWICPersistStreami IWICStreamProvider.

Notatka

Jeśli format metadanych ma ograniczenia, które sprawiają, że niektóre metody wymaganych interfejsów są nieodpowiednie, takie metody powinny zwracać WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

IWICMetadataReader interfejs

Interfejs IWICMetadataReader należy zaimplementować podczas tworzenia czytnika metadanych. Ten interfejs zapewnia dostęp do podrzędnych elementów metadanych w strumieniu danych w formacie metadanych.

Poniższy kod przedstawia definicję interfejsu czytnika metadanych zgodnie z definicją w pliku wincodecsdk.idl.

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

Metoda GetMetadataFormat zwraca identyfikator GUID formatu metadanych.

Metoda GetMetadataHandlerInfo zwraca interfejs IWICMetadataHandlerInfo zawierający informacje o obsługiwaczu metadanych. Obejmuje to informacje, takie jak formaty obrazów obsługujące format metadanych i czy czytnik metadanych wymaga dostępu do pełnego strumienia metadanych.

Metoda GetCount zwraca liczbę pojedynczych elementów metadanych (w tym osadzonych bloków metadanych) znalezionych w strumieniu metadanych.

Metoda GetValueByIndex zwraca element metadanych według wartości indeksu. Ta metoda umożliwia aplikacjom wykonywanie pętli przez każdy element metadanych w bloku metadanych. Poniższy kod pokazuje, jak aplikacja może użyć tej metody, aby pobrać każdy element metadanych w bloku metadanych.

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

Metoda GetValue pobiera określony element metadanych według schematu i/lub identyfikatora. Ta metoda jest podobna do metody GetValueByIndex, z tą różnicą, że pobiera element metadanych, który ma określony schemat lub identyfikator.

Metoda GetEnumerator zwraca moduł wyliczający każdego elementu metadanych w bloku metadanych. Dzięki temu aplikacje mogą używać modułu wyliczającego do nawigowania po formacie metadanych.

Jeśli format metadanych nie ma pojęcia schematów dla elementów metadanych, getValue... metody powinny ignorować tę właściwość. Jeśli jednak format obsługuje nazewnictwo schematów, należy przewidzieć wartość null.

Jeśli element metadanych jest osadzonym blokiem metadanych, utwórz procedurę obsługi metadanych z podstreamu osadzonej zawartości i zwróć nową procedurę obsługi metadanych. Jeśli dla zagnieżdżonego bloku nie jest dostępny czytnik metadanych, stwórz instancję i zwróć nieznany czytnik metadanych. Aby utworzyć nowy czytnik metadanych dla osadzonego bloku, wywołaj metodę CreateMetadataReaderFromContainer lub CreateMetadataReader, lub wywołaj funkcję WICMatchMetadataContent.

Jeśli strumień metadanych zawiera zawartość big-endian, czytnik metadanych jest odpowiedzialny za zamianę wszystkich wartości danych, które przetwarza. Jest również odpowiedzialny za informowanie wszystkich zagnieżdżonych czytników metadanych, że pracują ze strumieniem danych w formacie big-endian. Jednak wszystkie wartości powinny być zwracane w formacie little-endian.

Zaimplementuj obsługę nawigacji w przestrzeniach nazw, obsługując zapytania, w których identyfikator elementu metadanych to VT_CLSID (identyfikator GUID) odpowiadający formatowi metadanych. Jeśli wewnętrzny czytnik metadanych dla tego formatu zostanie zidentyfikowany w trakcie analizy, powinien być zwrócony. Dzięki temu aplikacje mogą używać czytnika zapytań metadanych do przeszukiwania formatu metadanych.

Podczas pobierania elementu metadanych według identyfikatora należy użyć funkcji PropVariantChangeType, aby przekształcić identyfikator w oczekiwany typ. Na przykład czytnik IFD wymusi konwersję identyfikatora na typ VT_UI2, aby odpowiadał on typowi danych identyfikatora tagu IFD USHORT. Typ wejściowy i oczekiwany muszą być oba PROPVARIANT, aby to zrobić. Nie jest to wymagane, ale wykonanie tego przymusu upraszcza kod, który wywołuje czytelnika do wykonywania zapytań o elementy metadanych.

IWICPersistStream, interfejs

Interfejs IWICPersistStream dziedziczy z IPersistStream i udostępnia dodatkowe metody zapisywania i ładowania obiektów przy użyciu wyliczeniaWICPersistOptions.

Poniższy kod przedstawia definicję interfejsu IWICPersistStream zgodnie z definicją w pliku wincodecsdk.idl.

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

Metoda LoadEx dostarcza strumień danych do czytnika metadanych, zawierający blok metadanych. Czytelnik analizuje ten strumień, aby uzyskać dostęp do podstawowych elementów metadanych. Czytnik metadanych jest inicjowany z podstreamem umieszczonym na początku nieprzetworzonej zawartości metadanych. Jeśli czytelnik nie wymaga pełnego strumienia, podstream jest ograniczony tylko do zawartości bloku metadanych; w przeciwnym razie pełny strumień metadanych jest dostarczany z pozycją ustawioną na początku bloku metadanych.

Metoda SaveEx jest używana przez autorów metadanych do serializacji bloku metadanych. Gdy SaveEx jest używane w czytniku metadanych, powinno zwrócić WINCODEC_ERR_UNSUPPORTEDOPERATION.

Interfejs IWICStreamProvider

Interfejs IWICStreamProvider umożliwia czytnikowi metadanych dostarczanie odwołań do strumienia zawartości, dostarczanie informacji o strumieniu i odświeżanie buforowanych wersji strumienia.

Poniższy kod przedstawia definicję interfejsu IWICStreamProvider zgodnie z definicją w pliku wincodecsdk.idl.

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

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

Metoda GetStream pobiera odwołanie do strumienia metadanych. Zwrócony strumień powinien mieć wskaźnik zresetowany do pozycji początkowej. Jeśli format metadanych wymaga pełnego dostępu do strumienia, pozycja początkowa powinna być początkiem bloku metadanych.

Metoda GetPersistOptions zwraca bieżące opcje strumienia z wyliczenia WICPersistOptions.

Metoda GetPreferredVendorGUID zwraca identyfikator GUID dostawcy czytnika metadanych.

Metoda RefreshStream odświeża strumień metadanych. Ta metoda musi wywołać LoadEx ze strumieniem NULL dla wszystkich zagnieżdżonych bloków metadanych. To jest konieczne, ponieważ zagnieżdżone bloki metadanych i ich elementy mogą już nie istnieć z powodu bezpośredniej edycji.

Tworzenie zapisywarki metadanych

Pisarz metadanych to typ programu do obsługi metadanych, który umożliwia serializowanie bloku metadanych w pojedynczej ramce obrazu lub poza nią, jeśli format obrazu to obsługuje. Głównym dostępem do mechanizmów zapisywania metadanych w koderze jest interfejs IWICMetadataBlockWriter, który implementuje każdy koder WIC. Ten interfejs umożliwia aplikacjom wyliczanie każdego bloku metadanych osadzonych w obrazie, dzięki czemu można odnaleźć i utworzyć wystąpienie odpowiedniego pisarza metadanych dla każdego bloku metadanych. Bloki metadanych, które nie mają odpowiedniego składnika zapisywania metadanych, są uznawane za nieznane i są definiowane jako identyfikator GUID CLSID_WICUnknownMetadataReader. Aby umożliwić aplikacjom WIC serializację i zapisywanie formatu metadanych, należy utworzyć klasę, która implementuje następujące interfejsy: IWICMetadataWriter, IWICMetadataReader, IWICPersistStreami IWICStreamProvider.

Notatka

Jeśli format metadanych ma ograniczenia, które sprawiają, że niektóre metody wymaganych interfejsów są nieodpowiednie, takie metody powinny zwracać WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Interfejs IWICMetadataWriter

Interfejs IWICMetadataWriter musi zostać zaimplementowany przez twój zapisator metadanych. Ponadto, ponieważ IWICMetadataWriter dziedziczy z IWICMetadataReader, należy również zaimplementować wszystkie metody IWICMetadataReader. Ponieważ oba typy obsługi wymagają tego samego dziedziczenia interfejsu, możesz utworzyć jedną klasę, która zapewnia zarówno funkcję odczytu, jak i zapisu.

Poniższy kod przedstawia definicję interfejsu modułu zapisywania metadanych zgodnie z definicją w pliku wincodecsdk.idl.

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

Metoda SetValue zapisuje określony element metadanych do strumienia metadanych.

Metoda SetValueByIndex zapisuje określony element metadanych do określonego indeksu w strumieniu metadanych. Indeks nie odwołuje się do identyfikatora, ale do pozycji elementu w bloku metadanych.

Metoda RemoveValue usuwa określony element metadanych ze strumienia metadanych.

Metoda RemoveValueByIndex usuwa element metadanych z określonego indeksu ze strumienia metadanych. Po usunięciu elementu oczekuje się, że pozostałe elementy metadanych zajmują opuszczony indeks, jeśli indeks nie jest ostatnim indeksem. Oczekuje się również, że liczba zmieni się po usunięciu elementu.

Odpowiedzialnością piszącego metadane jest przekonwertowanie elementów PROPVARIANT na podstawową strukturę wymaganą przez twój format. Jednak w przeciwieństwie do czytnika metadanych typy VARIANT nie powinny być zwykle zmuszane do różnych typów, ponieważ obiekt wywołujący wyraźnie wskazuje typ danych do użycia.

Autor metadanych musi zatwierdzić wszystkie elementy metadanych do strumienia obrazu, w tym ukryte lub nierozpoznane wartości. Obejmuje to nieznane zagnieżdżone bloki metadanych. Jednak obowiązkiem kodera jest ustawienie wszystkich krytycznych elementów metadanych przed zainicjowanie operacji zapisywania.

Jeśli strumień metadanych zawiera zawartość big-endian, autor metadanych jest odpowiedzialny za zamianę wartości danych, które przetwarza. Jest on również odpowiedzialny za informowanie wszystkich zagnieżdżonych pisarzy metadanych, że pracują ze strumieniem danych big-endian, gdy zapisują dane.

Zaimplementuj obsługę tworzenia i usuwania przestrzeni nazw, obsługując operacje ustawiania i usuwania elementów metadanych z typem VT_CLSID (identyfikator GUID) odpowiadający formatowi metadanych. Składnik zapisywania metadanych wywołuje funkcję WICSerializeMetadataContent w celu prawidłowego osadzenia zawartości zagnieżdżonego składnika zapisywania metadanych w nadrzędnym składniku zapisywania metadanych.

Jeśli format metadanych obsługuje bezpośrednie kodowanie, odpowiadasz za zarządzanie wymaganym wypełnieniem. Aby uzyskać więcej informacji na temat kodowania na miejscu, zobacz Przegląd metadanych WIC i Przegląd odczytywania i zapisywania metadanych obrazów.

IWICPersistStream, interfejs

Interfejs IWICPersistStream dziedziczy z IPersistStream i udostępnia dodatkowe metody zapisywania i ładowania obiektów przy użyciu wyliczeniaWICPersistOptions.

Poniższy kod przedstawia definicję interfejsu IWICPersistStream zgodnie z definicją w pliku wincodecsdk.idl.

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

Metoda LoadEx udostępnia twój system obsługi metadanych strumieniem danych zawierającym blok metadanych.

Metoda SaveEx serializuje metadane w strumieniu. Jeśli podany strumień jest taki sam jak strumień inicjowania, należy wykonać kodowanie w miejscu. Jeśli kodowanie na miejscu jest obsługiwane, ta metoda powinna zwrócić WINCODEC_ERR_TOOMUCHMETADATA, gdy nie ma wystarczającej ilości wypełnienia do wykonania kodowania na miejscu. Jeśli kodowanie w miejscu nie jest obsługiwane, ta metoda powinna zwrócić WINCODEC_ERR_UNSUPPORTEDOPERATION.

Metoda IPersistStream::GetSizeMax musi zostać zaimplementowana i musi zwrócić dokładny rozmiar zawartości metadanych, która zostanie zapisana w kolejnym zapisie.

Metoda IPersistStream::IsDirty powinna zostać zaimplementowana, jeśli zapis metadanych odbywa się za pośrednictwem strumienia, aby obraz mógł niezawodnie określić, czy jego zawartość uległa zmianie.

Jeśli format metadanych obsługuje zagnieżdżone bloki metadanych, pisarz metadanych powinien delegować zagnieżdżonym pisarzom metadanych serializację ich zawartości podczas zapisywania do strumienia.

IWICStreamProvider - interfejs

Implementacja interfejsu IWICStreamProvider modułu zapisywania metadanych jest taka sama jak w przypadku czytnika metadanych. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie czytnika metadanych w tym dokumencie.

Instalowanie i rejestrowanie programu obsługi metadanych

Aby zainstalować program obsługi metadanych, należy podać zestaw programu obsługi i zarejestrować go w rejestrze systemowym. Możesz zdecydować, jak i kiedy klucze rejestru są uzupełniane.

Notatka

W celu zapewnienia czytelności rzeczywiste identyfikatory GUID szesnastkowe nie są wyświetlane w kluczach rejestru przedstawionych w poniższych sekcjach tego dokumentu. Aby znaleźć wartość szesnastkową dla nazwy przyjaznej, zobacz pliki wincodec.idl i wincodecsdk.idl.

 

Klucze rejestru programu obsługi metadanych

Każda procedura obsługi metadanych jest identyfikowana przez unikatowy identyfikator CLSID i musi zarejestrować ten identyfikator CLSID w identyfikatorze GUID kategorii procedur obsługi metadanych. Identyfikator kategorii każdego typu obsługi jest zdefiniowany w pliku wincodec.idl; nazwa identyfikatora kategorii dla czytników to CATID_WICMetadataReader, a nazwa identyfikatora kategorii dla zapisujących to CATID_WICMetadataWriter.

Każda procedura obsługi metadanych jest identyfikowana przez unikatowy identyfikator CLSID, a każda musi zarejestrować swój identyfikator CLSID w kategorii GUID identyfikatora procedury obsługi metadanych. Identyfikator kategorii każdego typu operatora jest zdefiniowany w pliku wincodec.idl; nazwa identyfikatora kategorii dla czytników to CATID_WICMetadataReader, a nazwa identyfikatora kategorii dla zapisujących to CATID_WICMetadataWriter.

Notatka

W poniższych listach kluczy rejestru {Reader CLSID} odnosi się do unikatowego identyfikatora CLSID, który podałeś dla Twojego czytnika metadanych. {Writer CLSID} odwołuje się do unikatowego identyfikatora CLSID podanego dla pisarza metadanych. Element {Handler CLSID} odnosi się do identyfikatora CLSID czytnika, zapisywarki lub obu, w zależności od tego, które programy obsługi udostępniasz. {Identyfikator GUID kontenera} odwołuje się do obiektu kontenera (formatu obrazu lub formatu metadanych), który może zawierać blok metadanych.

 

Następujące klucze rejestru rejestrują Twoją obsługę metadanych z pozostałymi dostępnymi procedurami obsługi metadanych.

[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"

Oprócz rejestrowania procedur obsługi w odpowiednich kategoriach należy również zarejestrować dodatkowe klucze, które zawierają informacje specyficzne dla programu obsługi. Czytelnicy i autorzy mają podobne wymagania dotyczące klucza rejestru. Poniższa składnia pokazuje, jak zarejestrować program obsługi. Zarówno obsługiwacz czytnika, jak i obsługiwacz zapisywania muszą być zarejestrowane w ten sposób, przy użyciu odpowiednich identyfikatorów CLSID.

[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"

Czytelnicy metadanych

Rejestracja czytnika metadanych zawiera również klucze opisujące sposób osadzania czytnika w formacie kontenera. Format kontenera może być formatem obrazu, takim jak TIFF lub JPEG; może to być również inny format metadanych, taki jak blok metadanych IFD. Natywnie obsługiwane formaty kontenerów obrazów są wymienione w pliku wincodec.idl; każdy format kontenera obrazu jest definiowany jako identyfikator GUID o nazwie rozpoczynającej się od GUID_ContainerFormat. Natywnie obsługiwane formaty kontenerów metadanych są wymienione w pliku wincodecsdk.idl; każdy format kontenera metadanych jest definiowany jako identyfikator GUID o nazwie rozpoczynającej się od GUID_MetadataFormat.

Następujące klucze rejestrują kontener, który obsługuje czytnik metadanych, oraz dane potrzebne do odczytu z tego kontenera. Każdy kontener obsługiwany przez czytnik musi być zarejestrowany w ten sposób.

[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

Klucz wzorca opisuje wzorzec binarny używany do dopasowania bloku metadanych do czytnika. Podczas definiowania wzorca dla czytnika metadanych, wzorzec powinien być na tyle niezawodny, aby odpowiednie dopasowanie oznaczało, że czytnik metadanych może zrozumieć metadane w przetwarzanym bloku metadanych.

Klucz DataOffset opisuje stałe przesunięcie metadanych od nagłówka bloku. Ten klucz jest opcjonalny i, jeśli nie zostanie określony, oznacza, że rzeczywiste metadane nie mogą być zlokalizowane przy użyciu ustalonego przesunięcia od nagłówka bloku.

Autorzy metadanych

Rejestracja narzędzia do zapisywania metadanych zawiera również klucze opisujące, jak zapisać nagłówek poprzedzający zawartość metadanych osadzoną w formacie kontenera. Podobnie jak w przypadku czytnika, format kontenera może być formatem obrazu lub innym blokiem metadanych.

Następujące klucze rejestrują kontener, który obsługuje pisarz metadanych, oraz dane potrzebne do zapisania nagłówka i metadanych. Każdy kontener obsługiwany przez moduł zapisujący musi być zarejestrowany w ten sposób.

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

Klucz WriteHeader opisuje wzorzec binarny nagłówka bloku metadanych, który ma być zapisany. Ten wzorzec binarny pokrywa się z kluczem wzorca czytnika formatu metadanych.

Klucz WriteOffset opisuje stałe przesunięcie od nagłówka bloku, od którego metadane powinny być zapisywane. Ten klucz jest opcjonalny i, jeśli nie zostanie określony, oznacza, że rzeczywiste metadane nie powinny być zapisywane z nagłówkiem.

Podpisywanie programu obsługi metadanych

Wszystkie procedury obsługi metadanych muszą być podpisane cyfrowo, aby wziąć udział w procesie odnajdywania WIC. WIC nie załaduje żadnego obsługiwacza, który nie jest podpisany przez zaufany urząd certyfikacji. Aby uzyskać więcej informacji na temat podpisywania cyfrowego, zobacz Wprowadzenie do podpisywania kodu.

Zagadnienia specjalne

Poniższe sekcje zawierają dodatkowe informacje, które należy wziąć pod uwagę podczas tworzenia własnych procedur obsługi metadanych.

PROPVARIANTS

WIC używa PROPVARIANT do reprezentowania elementu metadanych zarówno do odczytu, jak i zapisu. Element PROPVARIANT udostępnia typ danych i wartość danych dla elementu metadanych używanego w formacie metadanych. Jako autor programu obsługi metadanych masz dużą elastyczność w zakresie sposobu przechowywania danych w formacie metadanych i reprezentowania ich w bloku metadanych. Poniższa tabela zawiera wskazówki ułatwiające podjęcie decyzji o odpowiednim typie PROPVARIANT do użycia w różnych sytuacjach.

Typ metadanych to... Użyj typu PROPVARIANT WŁAŚCIWOŚĆ PROPVARIANT
Puste lub nieistniejące. VT_EMPTY Nie dotyczy.
Niezdefiniowany. VT_BLOB Użyj właściwości blob, aby ustawić rozmiar i wskaźnik do obiektu BLOB przydzielonego przy użyciu CoTaskMemAlloc.
Blok metadanych. VT_UNKNOWN Ten typ używa właściwości punkVal.
Tablica typów. VT_VECTOR | VT_{type} Użyj właściwości ca{type}, aby ustawić liczbę i wskaźnik na tablicę przydzieloną za pomocą CoTaskMemAlloc.
Tablica bloków metadanych. VT_VECTOR | VT_VARIANT Użyj właściwości capropvar, aby ustawić tablicę wariantów.
Podpisana wartość racjonalna. VT_I8 Użyj właściwości hVal, aby ustawić wartość. Ustaw słowo wysokie w mianowniku i słowo niskie w liczniku.
Racjonalna wartość. VT_UI8 Użyj właściwości uhVal, aby ustawić wartość. Ustaw HighPart na mianownik, a LowPart na licznik. Należy pamiętać, że LowPart jest bezznakowym int. Licznik powinien zostać przekonwertowany z bezznakowego int na int, aby upewnić się, że bit znaku został zachowany, jeśli istnieje.

 

Aby uniknąć nadmiarowości w reprezentowaniu elementów tablicy, nie używaj bezpiecznych tablic; używać tylko prostych tablic. Zmniejsza to pracę, która musi być wykonywana przez aplikację podczas interpretowania typów PROPVARIANT.

Należy unikać używania VT_BYREF i przechowywać wartości w tekście, jeśli jest to możliwe. VT_BYREF jest nieefektywna w przypadku małych typów (wspólnych dla elementów metadanych) i nie udostępnia informacji o rozmiarze.

Przed użyciem PROPVARIANTzawsze wywołaj PropVariantInit, aby zainicjować wartość. Po zakończeniu pracy z PROPVARIANT zawsze wywołaj PropVariantClear, aby zwolnić dowolną pamięć przydzieloną dla zmiennej.

Programy obsługi 8BIM

Podczas pisania procedury obsługi metadanych dla bloku metadanych 8BIM należy użyć podpisu, który hermetyzuje zarówno podpis 8BIM, jak i identyfikator. Na przykład natywny czytnik metadanych 8BIMIPTC udostępnia następujące informacje rejestru na potrzeby odnajdywania czytelników:

[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

Czytnik 8BIMIPTC ma zarejestrowany wzorzec 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. Pierwsze cztery bajty (0x38, 0x42, 0x49, 0x4D) to podpis 8BIM, a dwa ostatnie bajty (0x04, 0x04) są identyfikatorem rekordu IPTC.

Dlatego aby napisać czytnik metadanych 8BIM dla informacji o rozdzielczości, potrzebny jest zarejestrowany wzorzec 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. Ponownie pierwsze cztery bajty (0x38, 0x42, 0x49, 0x4D) to podpis 8BIM. Ostatnie dwa bajty (0x03, 0xED), są jednak identyfikatorem informacji o rozdzielczości zdefiniowanym w formacie PSD.

koncepcyjny

Składnik programu Windows Imaging — omówienie

Przegląd Metadanych WIC

Przegląd języka zapytań metadanych

Omówienie odczytywania i zapisywania metadanych dla obrazów

Instrukcje: ponowne kodowanie obrazu JPEG przy użyciu metadanych

Inne zasoby

Jak napisać WIC-Enabled CODEC