Поделиться через


Общие сведения о расширяемости метаданных

В этом разделе описываются требования к созданию пользовательских обработчиков метаданных для компонента обработки образов Windows (WIC), включая как средства чтения метаданных, так и модули записи. Здесь также рассматриваются требования к расширению обнаружения компонентов среды выполнения WIC для включения пользовательских обработчиков метаданных.

В этом разделе содержатся следующие подразделы.

Предварительные требования

Чтобы понять эту тему, необходимо иметь глубокое представление о WIC, его компонентах и метаданных для изображений. Дополнительные сведения о метаданных WIC см. в статье Общие сведения о метаданных WIC. Дополнительные сведения о компонентах WIC см. в статье Общие сведения о компонентах обработки образов Windows.

Введение

Как описано в обзоре метаданных WIC, в изображении часто существует несколько блоков метаданных, каждый из которых представляет различные типы информации в разных форматах метаданных. Для взаимодействия с форматом метаданных, внедренным в изображение, приложение должно использовать соответствующий обработчик метаданных. WIC предоставляет несколько обработчиков метаданных (как для чтения метаданных, так и для записи), которые позволяют считывать и записывать метаданные определенных типов, таких как Exif или XMP.

В дополнение к собственным обработчикам WIC предоставляет API-интерфейсы, позволяющие создавать новые обработчики метаданных, участвующие в обнаружении компонентов среды выполнения WIC. Это позволяет приложениям, используюющим WIC, считывать и записывать пользовательские форматы метаданных.

Следующие действия позволяют обработчикам метаданных участвовать в обнаружении метаданных во время выполнения WIC.

  • Реализуйте класс обработчика metadata-reader (IWICMetadataReader), который предоставляет необходимые интерфейсы WIC для чтения пользовательского формата метаданных. Это позволяет приложениям на основе WIC считывать формат метаданных так же, как и собственные форматы метаданных.
  • Реализуйте класс обработчика модуля записи метаданных (IWICMetadataWriter), который предоставляет необходимые интерфейсы WIC для кодирования пользовательского формата метаданных. Это позволяет приложениям на основе WIC сериализовать формат метаданных в поддерживаемые форматы изображений.
  • Цифровая подпись и регистрация обработчиков метаданных. Это позволяет обнаруживать обработчики метаданных во время выполнения путем сопоставления шаблона идентификации в реестре с шаблоном, внедренным в файл образа.

Создание средства чтения метаданных

Main доступ к блокам метаданных в кодеке осуществляется через интерфейс IWICMetadataBlockReader, который реализует каждый кодек WIC. Этот интерфейс перечисляет каждый из блоков метаданных, внедренных в формат изображения, чтобы можно было обнаружить соответствующий обработчик метаданных и создать экземпляр для каждого блока. Блоки метаданных, которые не распознаются WIC, считаются неизвестными и определяются как CLSID_WICUnknownMetadataReader GUID. Чтобы формат метаданных распознавался WIC, необходимо создать класс, реализующий три интерфейса: IWICMetadataReader, IWICPersistStream и IWICStreamProvider.

Примечание

Если формат метаданных имеет ограничения, которые делают некоторые методы необходимых интерфейсов недопустимыми, такие методы должны возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Интерфейс IWICMetadataReader

Интерфейс IWICMetadataReader должен быть реализован при создании средства чтения метаданных. Этот интерфейс предоставляет доступ к элементам метаданных в потоке данных формата метаданных.

В следующем коде показано определение интерфейса чтения метаданных, определенное в файле 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
        );
};

Метод GetMetadataFormat возвращает GUID формата метаданных.

Метод GetMetadataHandlerInfo возвращает интерфейс IWICMetadataHandlerInfo , предоставляющий сведения о обработчике метаданных. Сюда входит информация о том, какие форматы изображений поддерживают формат метаданных и требуется ли читателю метаданных доступ к полному потоку метаданных.

Метод GetCount возвращает количество отдельных элементов метаданных (включая внедренные блоки метаданных), найденных в потоке метаданных.

Метод GetValueByIndex возвращает элемент метаданных по значению индекса. Этот метод позволяет приложениям перебирать каждый элемент метаданных в блоке метаданных. В следующем коде показано, как приложение может использовать этот метод для получения каждого элемента метаданных в блоке метаданных.

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

Метод GetValue извлекает определенный элемент метаданных по схеме и /или идентификатору. Этот метод аналогичен методу GetValueByIndex , за исключением того, что он извлекает элемент метаданных с определенной схемой или идентификатором.

Метод GetEnumerator возвращает перечислитель каждого элемента метаданных в блоке метаданных. Это позволяет приложениям использовать перечислитель для перемещения по формату метаданных.

Если формат метаданных не содержит понятия схем для элементов метаданных, getValue... Методы должны игнорировать это свойство. Однако если формат поддерживает именование схемы, следует ожидать значения NULL .

Если элемент метаданных является внедренным блоком метаданных, создайте обработчик метаданных из подпотка внедренного содержимого и верните новый обработчик метаданных. Если для вложенного блока нет средства чтения метаданных, создайте экземпляр и верните неизвестное средство чтения метаданных. Чтобы создать новое средство чтения метаданных для внедренного блока, вызовите методы CreateMetadataReaderFromContainer или CreateMetadataReader фабрики компонентов или вызовите функцию WICMatchMetadataContent .

Если поток метаданных содержит содержимое big-endian, читатель метаданных отвечает за переключение всех значений данных, которые он обрабатывает. Он также отвечает за информирование всех вложенных читателей метаданных о том, что они работают с потоком данных big-endian. Однако все значения должны возвращаться в формате с минимальным байтом.

Реализуйте поддержку навигации по пространствам имен, поддерживая запросы, где идентификатор элемента метаданных — ( VT_CLSID GUID), соответствующий формату метаданных. Если во время синтаксического анализа определяется модуль чтения вложенных метаданных для этого формата, он должен быть возвращен. Это позволяет приложениям использовать средство чтения запросов метаданных для поиска в формате метаданных.

При получении элемента метаданных по идентификатору следует использовать функцию PropVariantChangeType , чтобы принудить идентификатор к ожидаемому типу. Например, средство чтения IFD приведет идентификатор для ввода VT_UI2 , чтобы он совпадал с типом данных идентификатора тега IFD USHORT. Для этого тип входных данных и ожидаемый тип должны иметь значение PROPVARIANT . Это необязательно, но это приведение упрощает код, который вызывает средство чтения для запроса элементов метаданных.

Интерфейс IWICPersistStream

Интерфейс IWICPersistStream наследуется от IPersistStream и предоставляет дополнительные методы для сохранения и загрузки объектов с помощью перечисления WICPersistOptions .

В следующем коде показано определение интерфейса IWICPersistStream , как определено в файле 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
        );
};

Метод LoadEx предоставляет средству чтения метаданных поток данных, содержащий блок метаданных. Средство чтения анализирует этот поток для доступа к базовым элементам метаданных. Средство чтения метаданных инициализируется с помощью подпотока, расположенного в начале содержимого необработанных метаданных. Если для средства чтения не требуется полный поток, подпоток ограничен в диапазоне только содержимым блока метаданных; В противном случае полный поток метаданных предоставляется с позицией, заданной в начале блока метаданных.

Метод SaveEx используется средствами записи метаданных для сериализации блока метаданных. При использовании SaveEx в средстве чтения метаданных он должен возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

Интерфейс IWICStreamProvider

Интерфейс IWICStreamProvider позволяет средству чтения метаданных предоставлять ссылки на поток содержимого, предоставлять сведения о потоке и обновлять кэшированные версии потока.

В следующем коде показано определение интерфейса IWICStreamProvider , как определено в файле wincodecsdk.idl.

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

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

Метод GetStream извлекает ссылку на поток метаданных. Возвращаемый поток должен иметь указатель потока, сброшенный в начальную позицию. Если формат метаданных требует полного доступа к потоку, начальная позиция должна быть началом блока метаданных.

Метод GetPersistOptions возвращает текущие параметры потока из перечисления WICPersistOptions .

Метод GetPreferredVendorGUID возвращает GUID поставщика средства чтения метаданных.

Метод RefreshStream обновляет поток метаданных. Этот метод должен вызывать LoadEx с потоком NULL для всех вложенных блоков метаданных. Это необходимо, так как вложенные блоки метаданных и их элементы могут больше не существовать из-за редактирования на месте.

Создание модуля записи метаданных

Модуль записи метаданных — это тип обработчика метаданных, который предоставляет способ сериализации блока метаданных в кадр изображения или за пределами отдельного кадра, если формат изображения поддерживает его. Доступ main к записи метаданных в кодеке осуществляется через интерфейс IWICMetadataBlockWriter, который реализует каждый кодировщик WIC. Этот интерфейс позволяет приложениям перечислять каждый из блоков метаданных, внедренных в изображение, чтобы можно было обнаружить соответствующий модуль записи метаданных и создать экземпляр для каждого блока метаданных. Блоки метаданных, у которых нет соответствующего модуля записи метаданных, считаются неизвестными и определяются как guid CLSID_WICUnknownMetadataReader. Чтобы приложения с поддержкой WIC могли сериализовать и записывать формат метаданных, необходимо создать класс, реализующий следующие интерфейсы: IWICMetadataWriter, IWICMetadataReader, IWICPersistStream и IWICStreamProvider.

Примечание

Если формат метаданных имеет ограничения, которые делают некоторые методы необходимых интерфейсов недопустимыми, такие методы должны возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Интерфейс IWICMetadataWriter

Интерфейс IWICMetadataWriter должен быть реализован модулем записи метаданных. Кроме того, поскольку IWICMetadataWriter наследуется от IWICMetadataReader, необходимо также реализовать все методы IWICMetadataReader. Так как для обоих типов обработчиков требуется одинаковое наследование интерфейса, может потребоваться создать один класс, предоставляющий функции чтения и записи.

В следующем коде показано определение интерфейса записи метаданных, определенное в файле 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
        );
};

Метод SetValue записывает указанный элемент метаданных в поток метаданных.

Метод SetValueByIndex записывает указанный элемент метаданных в указанный индекс в потоке метаданных. Индекс ссылается не на идентификатор, а на позицию элемента в блоке метаданных.

Метод RemoveValue удаляет указанный элемент метаданных из потока метаданных.

Метод RemoveValueByIndex удаляет элемент метаданных по указанному индексу из потока метаданных. После удаления элемента ожидается, что остальные элементы метаданных будут занимать освобожденный индекс, если индекс не является последним индексом. Также ожидается, что счетчик изменится после удаления элемента.

Модуль записи метаданных отвечает за преобразование элементов PROPVARIANT в базовую структуру, необходимую для формата. Однако, в отличие от средства чтения метаданных, типы VARIANT обычно не должны быть приведены к разным типам, так как вызывающий объект конкретно указывает, какой тип данных следует использовать.

Модуль записи метаданных должен зафиксировать все элементы метаданных в потоке изображений, включая скрытые или нераспознанные значения. Сюда входят неизвестные блоки вложенных метаданных. Однако кодировщик отвечает за настройку критически важных элементов метаданных перед началом операции сохранения.

Если поток метаданных содержит содержимое big-endian, модуль записи метаданных отвечает за переключение всех значений данных, которые он обрабатывает. Он также отвечает за информирование всех вложенных модулей записи метаданных о том, что они работают с потоком данных big-endian при сохранении.

Реализуйте поддержку создания и удаления пространства имен, поддерживая операции задания и удаления для элементов метаданных с типом VT_CLSID (GUID), соответствующим формату метаданных. Модуль записи метаданных вызывает функцию WICSerializeMetadataContent для правильного внедрения содержимого модуля записи вложенных метаданных в родительский модуль записи метаданных.

Если формат метаданных поддерживает кодирование на месте, вы несете ответственность за управление необходимым заполнением. Дополнительные сведения о кодировании на месте см. в разделах Общие сведения о метаданных WIC и Общие сведения о чтении и записи метаданных изображений.

Интерфейс IWICPersistStream

Интерфейс IWICPersistStream наследуется от IPersistStream и предоставляет дополнительные методы для сохранения и загрузки объектов с помощью перечисления WICPersistOptions .

В следующем коде показано определение интерфейса IWICPersistStream , как определено в файле 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
        );
};

Метод LoadEx предоставляет обработчику метаданных поток данных, содержащий блок метаданных.

Метод SaveEx сериализует метаданные в поток. Если предоставленный поток совпадает с потоком инициализации, следует выполнить кодирование на месте. Если кодирование на месте поддерживается, этот метод должен возвращать WINCODEC_ERR_TOOMUCHMETADATA при недостаточном заполнении для выполнения кодирования на месте. Если кодирование на месте не поддерживается, этот метод должен возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

Метод IPersistStream::GetSizeMax должен быть реализован и возвращать точный размер содержимого метаданных, которое будет записано при последующем сохранении.

Метод IPersistStream::IsDirty следует реализовать, если модуль записи метаданных инициализирован с помощью потока, чтобы изображение удостоверяло определение того, изменилось ли его содержимое.

Если формат метаданных поддерживает вложенные блоки метаданных, модуль записи метаданных должен делегировать вложенным модулям записи метаданных сериализацию содержимого при сохранении в потоке.

Интерфейс IWICStreamProvider

Реализация интерфейса IWICStreamProvider для модуля записи метаданных аналогична реализации интерфейса средства чтения метаданных. Дополнительные сведения см. в разделе Создание средства чтения метаданных этого документа.

Установка и регистрация обработчика метаданных

Чтобы установить обработчик метаданных, необходимо предоставить сборку обработчика и зарегистрировать ее в системном реестре. Вы можете решить, как и когда заполняются разделы реестра.

Примечание

Для удобочитаемости фактические шестнадцатеричные идентификаторы GUID не отображаются в разделах реестра, приведенных в следующих разделах этого документа. Чтобы найти шестнадцатеричное значение для указанного понятного имени, см. файлы wincodec.idl и wincodecsdk.idl.

 

Разделы реестра обработчика метаданных

Каждый обработчик метаданных идентифицируется уникальным идентификатором CLSID, и каждый обработчик должен зарегистрировать свой ИДЕНТИФИКАТОР CLSID под идентификатором GUID идентификатора категории обработчика метаданных. Идентификатор категории каждого типа обработчика определяется в файле wincodec.idl; Имя идентификатора категории для читателей — CATID_WICMetadataReader, а имя идентификатора категории для записи — CATID_WICMetadataWriter.

Каждый обработчик метаданных идентифицируется уникальным идентификатором CLSID, и каждый обработчик должен зарегистрировать свой ИДЕНТИФИКАТОР CLSID под идентификатором GUID идентификатора категории обработчика метаданных. Идентификатор категории каждого типа обработчика определяется в файле wincodec.idl; Имя идентификатора категории для читателей — CATID_WICMetadataReader, а имя идентификатора категории для записи — CATID_WICMetadataWriter.

Примечание

В следующих разделах реестра {Reader CLSID} ссылается на уникальный идентификатор CLSID, предоставленный для средства чтения метаданных. {Writer CLSID} ссылается на уникальный идентификатор CLSID, который вы предоставляете для записи метаданных. {Handler CLSID} ссылается на CLSID читателя, CLSID модуля записи или и то, и другое в зависимости от того, какие обработчики вы предоставляете. {Container GUID} ссылается на объект контейнера (формат изображения или метаданных), который может содержать блок метаданных.

 

Следующие разделы реестра регистрируют обработчик метаданных с другими доступными обработчиками метаданных:

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

Помимо регистрации обработчиков в соответствующих категориях, необходимо также зарегистрировать дополнительные ключи, предоставляющие сведения, относящиеся к обработчику. Читатели и записи имеют аналогичные требования к разделу реестра. В следующем синтаксисе показано, как зарегистрировать обработчик. Обработчик чтения и обработчик записи должны быть зарегистрированы таким образом, используя соответствующие идентификаторы 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"

Читатели метаданных

Регистрация средства чтения метаданных также включает ключи, описывающие способ внедрения средства чтения в формат контейнера. Формат контейнера может быть форматом изображения, например TIFF или JPEG; Это также может быть другой формат метаданных, например блок метаданных IFD. Форматы контейнеров образов, поддерживаемые в собственном коде, перечислены в wincodec.idl; Каждый формат контейнера образов определяется как GUID с именем, начинающимся с GUID_ContainerFormat. Форматы контейнеров метаданных, поддерживаемые в собственном коде, перечислены в wincodecsdk.idl; Каждый формат контейнера метаданных определяется как GUID с именем, начинающимся с GUID_MetadataFormat.

Следующие ключи регистрируют контейнер, поддерживаемый средством чтения метаданных, и данные, необходимые для чтения из этого контейнера. Каждый контейнер, поддерживаемый средством чтения, должен быть зарегистрирован таким образом.

[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

Ключ Pattern описывает двоичный шаблон, используемый для сопоставления блока метаданных с читателем. При определении шаблона для средства чтения метаданных он должен быть достаточно надежным, чтобы положительное совпадение означать, что читатель метаданных может понять метаданные в обрабатываемом блоке метаданных.

Ключ DataOffset описывает фиксированное смещение метаданных из заголовка блока. Этот ключ является необязательным. Если он не указан, фактические метаданные невозможно найти с помощью фиксированного смещения от заголовка блока.

Записи метаданных

Регистрация модуля записи метаданных также включает ключи, описывающие способ записи заголовка перед содержимым метаданных, внедренным в формат контейнера. Как и в случае с средством чтения, формат контейнера может быть форматом изображения или другим блоком метаданных.

Следующие ключи регистрируют контейнер, поддерживаемый модулем записи метаданных, и данные, необходимые для записи заголовка и метаданных. Каждый контейнер, поддерживаемый модулем записи, должен быть зарегистрирован таким образом.

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

Ключ WriteHeader описывает двоичный шаблон записываемого заголовка блока метаданных. Этот двоичный шаблон совпадает с ключом шаблона чтения формата метаданных.

Ключ WriteOffset описывает фиксированное смещение от заголовка блока, в который должны быть записаны метаданные. Этот ключ является необязательным и, если он не указан, означает, что фактические метаданные не должны записываться с помощью заголовка .

Подписывание обработчика метаданных

Для участия в процессе обнаружения WIC все обработчики метаданных должны иметь цифровую подпись. WIC не будет загружать обработчики, которые не подписаны доверенным центром сертификации. Дополнительные сведения о цифровой подписи см. в статье Общие сведения о подписывание кода.

Особые рекомендации

В следующих разделах содержатся дополнительные сведения, которые необходимо учитывать при создании собственных обработчиков метаданных.

PROPVARIANTS

WIC использует PROPVARIANT для представления элемента метаданных как для чтения, так и для записи. PROPVARIANT предоставляет тип данных и значение данных для элемента метаданных, используемого в формате метаданных. Как модуль записи обработчика метаданных вы имеете большую гибкость в том, как данные хранятся в формате метаданных и как данные представляются в блоке метаданных. В следующей таблице приведены рекомендации, которые помогут вам выбрать подходящий тип PROPVARIANT для использования в различных ситуациях.

Тип метаданных: ... Использование типа PROPVARIANT Свойство PROPVARIANT
Пустой или несуществующий. VT_EMPTY Не применяется
Не определено. VT_BLOB Используйте свойство BLOB-объекта, чтобы задать размер и указатель на объект BLOB, выделенный с помощью CoTaskMemAlloc.
Блок метаданных. VT_UNKNOWN Этот тип использует свойство punkVal.
Массив типов. VT_VECTOR | VT_{type} Используйте свойство ca{type}, чтобы задать число и указатель на массив, выделенный с помощью CoTaskMemAlloc.
Массив блоков метаданных. VT_VECTOR | VT_VARIANT Используйте свойство capropvar, чтобы задать массив вариантов.
Рациональное значение со знаком. VT_I8 Чтобы задать значение, используйте свойство hVal. Присвойте высокому слову знаменатель, а нижнему слову — числитель.
Рациональное значение. VT_UI8 Используйте свойство uhVal, чтобы задать значение. Задайте для параметра HighPart значение знаменателя, а для LowPart — числитель. Обратите внимание, что LowPart является int без знака. Числитель должен быть преобразован из неподписанных int в int, чтобы обеспечить сохранение бита знака при его наличии.

 

Чтобы избежать избыточности в представлении элементов массива, не используйте безопасные массивы; использовать только простые массивы. Это сокращает работу, которую приложение должно выполнять при интерпретации типов PROPVARIANT .

Избегайте использования VT_BYREF и хранения значений в строке, когда это возможно. VT_BYREF неэффективен для небольших типов (общих для элементов метаданных) и не предоставляет сведения о размере.

Перед использованием PROPVARIANT всегда вызывайте PropVariantInit для инициализации значения. Завершив работу с PROPVARIANT, всегда вызывайте PropVariantClear , чтобы освободить память, выделенную для переменной.

Обработчики 8BIM

При написании обработчика метаданных для блока метаданных 8BIM необходимо использовать сигнатуру, которая инкапсулирует как сигнатуру 8BIM, так и идентификатор. Например, собственное средство чтения метаданных 8BIMIPTC предоставляет следующие сведения реестра для обнаружения читателей:

[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

Средство чтения 8BIMIPTC имеет зарегистрированный шаблон 0x38, 0x42, 0x49, 0x4D, 0x04 0x04. Первые четыре байта (0x38, 0x42, 0x49, 0x4D) являются сигнатурой 8BIM, а последние два байта (0x04, 0x04) — идентификатором записи IPTC.

Таким образом, чтобы написать средство чтения метаданных 8BIM для получения сведений о разрешении, вам потребуется зарегистрированный шаблон 0x38, 0x42, 0x49, 0x4D, 0x03 0xED. Опять же, первые четыре байта (0x38, 0x42, 0x49 0x4D) являются сигнатурой 8BIM. Однако последние два байта (0x03, 0xED) являются идентификатором сведений о разрешении в соответствии с форматом PSD.

Основные понятия

Общие сведения о компоненте обработки образов Windows

Общие сведения о метаданных WIC

Общие сведения о языке запросов метаданных

Общие сведения о чтении и записи метаданных изображения

Практическое руководство. Повторное кодирование изображения JPEG с помощью метаданных

Другие ресурсы

Написание кодека WIC-Enabled