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

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

Метаданные изображения — это данные, внедренные в файл изображения, который предоставляет дополнительные сведения об изображении, например устройство, используемое для захвата изображения, или размеры изображения. Хотя они содержатся в самом файле изображения, эти метаданные не являются частью данных отрисовки. WIC предоставляет интерфейсы, позволяющие считывать и записывать эти метаданные для нескольких распространенных форматов метаданных, включая XMP, файл с обменом изображения (EXIF) и текстовые данные Png (tEXt).

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

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

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

Введение

Метаданные предоставляют расширенные сведения об изображении. Эти сведения можно использовать несколькими способами. Изображение может содержать метаданные, такие как описание, рейтинг, теги категорий и сведения об авторских правах. Доступ к метаданным упрощает выполнение таких задач, как управление ресурсами, расположение файлов или определение сведений об авторских правах. Например, фотоальбом Windows в Windows Vista позволяет добавлять описания и теги категорий к изображениям. Это позволяет лучше обнаруживать изображения и удобно классифицировать изображения. С помощью API WIC и распространенных форматов метаданных приложения могут легко записывать и считывать метаданные этого типа на изображения и из изображений.

На следующей схеме показано содержимое JPEG-файла, включающего встроенные блоки метаданных и элементы метаданных.

Изображение jpeg с метаданными оценки

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

Чтение метаданных изображения

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

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

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

Средство чтения запросов предоставляет методы для получения сведений о конкретных метаданных и средства для указания элемента метаданных для извлечения. В следующем коде используется выражение запроса для запроса определенного элемента метаданных в блоке Каталога вложенных изображений App1 (IFD). Для этого используется метод GetMetadataByName средства чтения запроса. В следующем коде показано использование средства чтения запросов для получения значения оценки MicrosoftPhoto.

PROPVARIANT value;
PropVariantInit(&value);

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

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

Переменная pwzRatingQuery в предыдущем примере является строкой запроса для доступа к рейтингу MicrosoftPhoto элемента метаданных. Эта строка создается с помощью языка запросов метаданных. Чтобы создать эту строку, для получения отдельных элементов метаданных необходимо знание формата метаданных и языка запросов метаданных. Дополнительные сведения о языке запросов метаданных см. в статье Общие сведения о языке запросов метаданных.

В фоновом режиме средство чтения запросов использует средство чтения метаданных (IWICMetadataReader) для доступа к метаданным, описанным в выражении запроса. Помимо использования средства чтения запросов, вы также можете напрямую получить доступ к средству чтения метаданных для чтения метаданных. Средство чтения метаданных можно получить из декодера или отдельных кадров, запросив интерфейс средства чтения блоков (IWICMetadataBlockReader).

Запись метаданных изображения

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

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

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

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

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

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

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

Не все форматы метаданных поддерживают быстрые метаданные. Сведения о том, какие форматы поддерживают быстрое кодирование метаданных, см. в таблице в разделе Поддерживаемые форматы метаданных далее в этом документе.

В фоновом режиме модуль записи запросов использует модуль записи метаданных (IWICMetadataWriter) для записи метаданных, описанных в выражении запроса. Помимо использования средства чтения запросов, вы также можете получить доступ к средству записи метаданных напрямую для записи метаданных. Модуль записи метаданных можно получить из декодера или отдельных кадров с помощью запроса интерфейса модуля записи блоков (IWICMetadataBlockWriter).

Расширяемость метаданных

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

Для полной поддержки других форматов метаданных необходимо разработать два типа обработчиков: средство чтения метаданных для чтения метаданных и средство записи метаданных для записи метаданных. Хотя эти два обработчика обычно реализуются парами для определенного формата, это не является обязательным требованием. В некоторых случаях требуется только чтение или только запись.

Дополнительные сведения о расширяемости метаданных с помощью API WIC см. в статье Общие сведения об расширяемости метаданных.

Поддерживаемые форматы метаданных

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

Поддерживаемые форматы метаданных Версия спецификации метаданных Поддержка формата изображений Поддерживает быстрое кодирование метаданных
App0 JFIF 1.02 JPEG Нет
Приложение 1 JFIF 1.02 JPEG, TIFF Нет
App13 Неизвестно JPEG, TIFF Нет
IFD TIFF 6.0 JPEG, TIFF Да
IRB Неизвестно JPEG, TIFF Нет
Exif Exif 2.2 JPEG, TIFF Да
XMP XMP 1.0 (сентябрь 2005 г.) JPEG, TIFF Да
GPS Exif 2.2 JPEG, TIFF Да
IPTC IPTC 4.0 JPEG, TIFF Да
Текст PNG 1.2 PNG Нет

 

Примечание

IPTC поддерживает FME только в том случае, если размер блоков увеличивается, так как IPTC не поддерживает заполнение.

 

Сводка компонента метаданных

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

Компонент Описание
Декодер растровых изображений (IWICBitmapDecoder)
  • Считывает поток изображения и создает пригодный для использования источник растрового изображения. Связан с форматом контейнера, например форматом файлов изображений с тегами (TIFF) или Объединенной группой экспертов по фотографии (JPEG).
  • Реализует интерфейс IWICMetadataBlockReader для перечисления всех блоков метаданных в потоке данных декодера, которые не находятся внутри кадра.
  • Предоставляет средство чтения запросов для чтения метаданных, связанных с изображением, которое не находится внутри кадра.
Декодирование точечных кадров (IWICBitmapFrameDecode)
  • Обращается к отдельным кадрам из потока изображений, удерживаемого декодером.
  • Реализует интерфейс IWICMetadataBlockReader для перечисления всех блоков метаданных в потоке данных кадра.
  • Предоставляет средство чтения запросов для чтения метаданных, связанных с кадром, с помощью выражений запроса.
Кодировщик растровых изображений (IWICBitmapEncoder)
  • Записывает источник точечных изображений в поток изображений. Связан с форматом контейнера, таким как TIFF или JPEG.
  • Реализует интерфейс IWICMetadataBlockWriter для создания списка блоков метаданных для записи в поток данных кодировщика.
  • Предоставляет модуль записи запросов для записи метаданных, связанных с изображением, с помощью выражений запроса.
Bitma Frame Encode (IWICBitmapFrameEncode)
  • Создает кадр, который будет закодирован в потоке, удерживаемом кодировщиком.
  • Реализует интерфейс IWICMetadataBlockWriter для создания списка блоков метаданных для записи в поток данных кадра.
  • Предоставляет модуль записи запросов для записи метаданных, связанных с кадром, с помощью выражений запроса.

 

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

Компонент Описание
Читатель запросов метаданных (IWICMetadataQueryReader)
  • Принимает строку запроса и перемещается по базовой иерархии метаданных для получения метаданных.
Модуль записи запросов метаданных (IWICMetadataQueryWriter)
  • Принимает строку запроса и перемещается по базовой иерархии метаданных, чтобы получить, задать и удалить метаданные.
Читатель блоков метаданных (IWICMetadataBlockReader)
  • Управляет доступной только для чтения коллекцией объектов IWICMetadataReader в верхней части иерархии метаданных и включает перечисление всех блоков метаданных.
  • Реализуется декодером точечных рисунков и декодированного растрового кадра.
  • Реализуется сторонними разработчиками компонентов для пользовательских кодеков.
Модуль записи блоков метаданных (IWICMetadataBlockWriter)
  • Управляет коллекцией операций чтения и записи объектов IWICMetadataWriter в верхней части иерархии метаданных.
  • Реализуется кодировщиком точечных рисунков и кодированием растрового кадра.
  • Реализуется сторонними разработчиками компонентов для пользовательских кодеков.
Читатель метаданных (IWICMetadataReader)
  • Анализирует поток метаданных и управляет доступной только для чтения коллекцией элементов метаданных. Связан с форматом метаданных, таким как EXIF, IFD и XMP.
  • Действует как словарь, возвращая значение при указании пары форматов и идентификаторов.
  • Реализуется сторонними разработчиками компонентов для пользовательских типов метаданных.
Модуль записи метаданных (IWICMetadataWriter)
  • Анализирует и сериализует поток метаданных, а также управляет коллекцией элементов метаданных для чтения и записи.
  • Реализуется сторонними разработчиками компонентов для пользовательских типов метаданных.
Кодировщик быстрых метаданныхIWICFastMetadataEncoder
  • Предоставляет семантику для записи в иерархии метаданных, которая обновляет метаданные на месте без повторного кодирования изображения.

 

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

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

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

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

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

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