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

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

Эта тема описана в следующих разделах.

Необходимые компоненты

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

Введение

Вы взаимодействуете с платформой метаданных в основном с помощью двух компонентов объектной модели (COM): средства чтения запросов, представленного интерфейсом IWICMetadataQueryReader, а также средством записи запросов, представленным интерфейсом IWICMetadataQueryWriter. Эти компоненты позволяют считывать или записывать метаданные с помощью языка запросов метаданных. Язык запросов описывает синтаксис выражения пути и компоненты запроса используют это выражение пути для доступа к нужным метаданным. Это выражение пути описывает расположение блока метаданных или элемента.

Блок метаданных — это именованной группы метаданных в определенном формате. Блок метаданных может содержать отдельные элементы метаданных, такие как время разработки или создания, а также дополнительные блоки метаданных. Имя блока метаданных определяется его форматом. Например, блок метаданных, содержащий метаданные App1, будет называться app1. Распространенные форматы метаданных включают App1, Exif, IFD и XMP.

Элемент метаданных — это пара "имя-значение", описывающая характеристики, такие как автор, название и оценка.

Выражение пути содержит одно или несколько имен блоков метаданных. Он также может указать элемент метаданных в блоке метаданных. Следующее выражение пути представляет блок App1, содержащий блок IFD, содержащий элемент метаданных:

  • /app1/ifd/{ushort=18249}

На следующей схеме показана макияж примера изображения JPEG с четырьмя блоками корневых метаданных: App0, App1, XMP и неизвестный блок. Каждый выделенный элемент отмечает тип метаданных (блок или элемент) и выражение запроса, используемое для извлечения данных.

jpeg image with metadata callouts

Примечание.

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

 

Анатомия выражения пути

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

Что такое полное выражение запроса? В WIC полное выражение — это строка, которая начинается с косой черты пути (/), за которой следует путь навигации к блоку метаданных или конкретному элементу метаданных. Каждый шаг в пути навигации разделен косой чертой, формируя выражение для доступа к блоку метаданных или элементу метаданных. Например, ниже приведено полное выражение запроса, которое обращается к рейтингу фотографий Майкрософт в блоке IFD, вложенном в блок App1:

  • /app1/ifd/{ushort=18249}

При синтаксическом анализе этого выражения сначала выполняется поиск блока метаданных App1 в метаданных образа. Если блок App1 найден, он продолжает поиск вложенного блока метаданных IFD. Если блок IFD найден, он ищет конкретный элемент метаданных, в данном случае рейтинг MicrosoftPhoto под тегом 18249 в блоке метаданных IFD. Если в любое время WIC не находит блок метаданных или элемент, он прерывает запрос.

Выбор блока

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

  • /app0
  • /app1
  • /app1/ifd
  • /app1/ifd/exif
  • /Xmp

При использовании средства чтения запросов или записи для выполнения запроса возвращается новый модуль чтения запросов или записи, который обслуживает запросы в область указанного блока метаданных. Например, при выполнении запроса "/app1" создается новый модуль чтения запросов, и запросы к новому читателю относятся к блоку App1. Это означает, что запрос "/ifd" действителен для нового средства чтения, так как блок App1 содержит блок IFD. Однако "/xmp" не будет работать, так как этот блок App1 не содержит блок метаданных XMP.

Язык запросов также поддерживает нотацию индекса. Нотация индекса предоставляет доступ к определенному блоку метаданных при наличии нескольких блоков одного типа. В примере JPEG можно использовать следующее индексированного выражения пути:

  • /[0]app1/[0]ifd

На языке запросов все индексы начинаются с нуля. В предыдущем выражении первые нулевые запросы для первого блока App1 и второй ноль запрашивает первый вложенный блок IFD. Нотация индекса по-прежнему может использоваться, даже если несколько блоков одного типа не существуют. Если в примере JPEG включен второй блок App1 со встроенным блоком IFD, выражение "/[1]app1/ifd" будет использоваться для доступа к второму блоку App1.

Нотация индекса становится более распространенной при работе с блоками PNG tEXt, так как, скорее всего, изображение PNG будет иметь несколько блоков tEXt.

Примечание.

Многомерные индексы массива не поддерживаются.

 

Выбор элемента

Вы можете получить доступ к элементам метаданных в блоке метаданных, создав выражения выбора блока. Рассмотрим свойства рейтинга XMP и Microsoft Photo в примере JPEG. Эти метаданные существуют в двух блоках метаданных: блоки App1/IFD и XMP. Таким образом, для доступа к тем же данным можно использовать несколько выражений. Следующее выражение обращается к рейтингу MicrosoftPhoto в блоке XMP:

  • /xmp/xmp:Rating

Часть выражения xmp:— это понятный идентификатор схемы. XMP — это расширяемый стандарт и позволяет сторонним сущностям публиковать собственные схемы, определяющие, как хранить определенные элементы метаданных. Схема XMP полностью определяется URL-адресом, но WIC предоставляет набор понятных идентификаторов для известных схем. Дополнительные сведения см. в разделе "Запросы метаданных в формате собственного изображения".

Для изображений JPEG сведения о рейтинге также можно хранить в вложенных блоках IFD App1. Однако в отличие от примера рейтинга XMP блок IFD не использует имя схемы для доступа к сведениям о рейтинге. Вместо этого используется выражение данных. Следующее выражение используется для доступа к рейтингу MicrosoftPhoto в вложенном блоке IFD App1:

  • /app1/ifd/{ushort=18249}

В этом выражении часть выражения "/app1/ifd" — это путь навигации к блоку IFD (как описано ранее в разделе выбора блоков). Вторая часть выражения "/{ushort=18249}" обращается к данным. Эта часть выражения указывает средству синтаксического анализа запроса найти данные, внедренные в неподписанный короткий тег с идентификатором тега 18249.

Примечание.

Список распространенных форматов метаданных, поддерживаемых каждым форматом изображения, см. в разделе "Запросы метаданных в собственном формате изображения".

 

{ushort=18249} — это выражение данных и может принимать несколько форм. Выражение данных — это два выражения части, содержащее запрошенный тег метаданных или ключ, в данном случае —18249, а также тип данных ключа в данном случае «ushort». Две части разделены знаком равенства (=). WICsupports большинство распространенных типов данных C/C++. Следующие типы данных принимаются языком запросов:

  • char
  • Uchar
  • short
  • ushort
  • длинный
  • ulong
  • INT
  • uint
  • longlong
  • с плавающей запятой
  • двойной точности
  • str
  • wstr
  • guid
  • bool

Примечание.

Этот список указывает только типы данных, поддерживаемые языком запросов метаданных. Используйте эти типы данных при создании выражения данных запроса метаданных, например {ushort=18249}. WIC возвращает значение элемента метаданных в виде PROPVARIANT, определяющего собственную систему типов.

 

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

В отличие от примера XMP Rating, в блоке App1/IFD нет столкновения имен для значения рейтинга. Это связано с тем, что значение оценки XMP фактически хранится в другом теге ushort 18246. Таким образом, выражение для доступа к рейтингу XMP в блоке App1/IFD:

  • /app1/ifd/{ushort=18246}

Примечание.

Официальное описание языка запросов метаданных см. в разделе "Сводка по языку запросов метаданных" далее в этом документе.

 

Escape-символ

Язык запросов не учитывает регистр и обрабатывает все символы как строчные регистры. Однако некоторые форматы метаданных (например, XMP) чувствительны к регистру. При работе с форматом метаданных с учетом регистра используйте символ обратной косой черты (\), если вы хотите указать символ верхнего регистра.

Escape-символ используется средство синтаксического анализа языка и следующий символ, который следует за ним, интерпретируется напрямую. Например, выражение {char=\}разрешается как "\", а {char=\C} разрешается в виде верхнего регистра C. Без escape-символа {char=\} будет недопустимым выражением, а {char=C} интерпретируется как строчный c. Не забудьте использовать escape-символ обратной косой черты перед всеми прописными буквами в форматах метаданных, которые чувствительны к регистру.

Примеры выражений

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

Expression Description
ifd/xmp/exif:Author Соответствует следующему пути навигации: блок IFD —> блок XMP —> свойство Author в схеме Exif.
/[1]ifd/[0]xmp/exif:Author То же самое, что и первый элемент в этой таблице, за исключением префикса [#] описывает, какой элемент следует перемещать в случае столкновения имен.
/ifd/{ushort=700}/Author Аналогично первому элементу в этой таблице, за исключением того, что он использует выражение данных для ссылки на блок XMP вместо имени блока xmp (блок XMP внедрен в идентификатор короткого тега без знака 700). Кроме того, свойство Author не указывает схему. Средство синтаксического анализа запросов попытается сопоставить свойство во всех схемах и вернуть первое совпадение.
/ifd/xmp Предоставляет путь навигации к блоку метаданных. Если блок найден, возвращается новый модуль чтения метаданных или записи.
/[*]tEXt/Keyword Возвращает или задает свойство Ключевого слова для блока PNG. Так как спецификация метаданных PNG позволяет использовать несколько блоков определенного типа, нотация [*] возвращает или задает блок данных PNG с соответствующим свойством. В спецификации PNG два блока не могут иметь одинаковые свойства.

 

Каждый блок метаданных также однозначно определяется GUID метаданных, который можно использовать вместо понятного имени блока. Следующий синтаксис можно использовать вместо предоставления имен блоков: "/{guid=GUID}/[n]{guid=GUID}/schema:tagidentifier"

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

Недопустимое выражение Описание отклонения
/ifd/[0][2]exif/ Отклонено, так как многомерные индексы массива не поддерживаются.
/ifd/{ushort=1}/{ushort=2} Отклонен, если IFD не имеет tagID=1, который является обработчиком метаданных, который содержит элемент метаданных с тегом TAGID=2.
/{ushort=1} Отклонено, если обработка запроса относится к верхнему уровню иерархии метаданных. Это связано с тем, что верхний уровень содержит только блоки метаданных, а не элементы данных.

 

Выражения политики метаданных фотографий

Как отмечалось ранее, полное выражение запроса начинается с косой черты (/). Выражения, которые не начинаются с косой черты, оцениваются как выражения политики. Выражение политики позволяет запрашивать метаданные фотографии для свойств оболочки Windows, связанных с изображением. В разделе выбора данных, приведенном ранее в этом документе, выражение "/xmp/xmp:Rating" использовалось для доступа к свойству рейтинга XMP. Это свойство также можно запрашивать с помощью следующего выражения политики:

  • System.SimpleRating

Чтобы получить доступ к свойству оценки из схемы MicrosoftPhoto, можно использовать следующее выражение запроса:

  • System.Rating

Выражения политики метаданных фотографий ведут себя по-разному от полного запроса метаданных несколькими заметными способами.

Во-первых, при доступе к метаданным с помощью выражения политики WIC выполняет арбитраж и разрешение конфликтов в случае, если одно и то же свойство доступно в нескольких блоках метаданных. Например, значения оценки MicrosoftPhoto и XMP хранятся как в блоке App1/IFD, так и в блоке XMP. Политика метаданных фотографии определяет приоритет, для которого возвращается значение блока при чтении метаданных. При написании метаданных политика метаданных фотографии гарантирует, что одинаковые свойства в разных блоках согласованы. Если вы используете запрос метаданных, например "/xmp/xmp:Rating", вы несете ответственность за арбитраж между различными расположениями метаданных.

Примечание.

Список поддерживаемых выражений политики и их политик сопоставления см. в разделе "Политики метаданных фотографий".

 

Во-вторых, выражения политики метаданных фотографий не зависят от формата изображения, в то время как полные запросы метаданных не являются. Например, запрос "/xmp/xmp:Rating" зависит от формата JPEG. Изображения TIFF также поддерживают метаданные XMP, но они хранятся по-разному по сравнению с JPEG, поэтому запрос TIFF будет иметь значение "/ifd/xmp/xmp:Rating". Однако в обоих случаях выражение политики будет "System.SimpleRating".

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

Сводка по языку запросов метаданных

В следующей таблице представлено официальное определение языка запросов метаданных WIC. Каждый символ грамматики представляет выражение, состоящее из других символов. Выражение может быть другим символом или последовательностью других символов, разделенных вертикальной полосой (|), указывающей выбор "или". Все выражение справа — это возможная подстановка указанного символа слева.

Символ Выражение
<path> <name> | Путь к свойству '/' <>
<Путь к свойству> <Элемент> метаданных | <путь свойства '/' <путь> к свойству>
<Элемент метаданных> <Имя> индекса | <Имя> элемента | <Имя> элемента схемы ":" <>
<Имя схемы> <Имя элемента>
<Имя элемента> <Элемент> метаданных | <индексированные индексы элементов><>
<индексированные элементы> <элемент> | <элемент подразумеваемых метаданных><>
<подразумеваемые метаданные> '<'name>'><'
<item> <name> | < Данные> индекса><| <Данных>
<data> Тип данных "{" ">=" <<значение> "}"
< Индекс> '[' <число> | <звезда> ']'
<типа данных> 'char' | 'uchar' | 'short' | 'ushort' | 'long' | 'ulong' | 'int' | 'uint' | 'longlong' | 'ulonglong' | 'float' | 'double' | 'str' | 'wstr' | 'guid' | 'bool'
<значение данных> <число> | <name> | <Guid>
<Звездочные> '*'
<number> number
<name> строка
<guid> guid

 

Концептуальной

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

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

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

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

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