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


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

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

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

Необходимые условия

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

Знакомство

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

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

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

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

  • /app1/ifd/{ushort=18249}

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

изображение jpeg с аннотациями метаданных,,

Заметка

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

 

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

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

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

  • /app1/ifd/{ushort=18249}

При синтаксическом анализе этого выражения WIC сначала выполняет поиск блока метаданных 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:Оценка

Часть выражения 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». Две части разделены знаком равенства (=). WIC поддерживает большинство общих типов данных C/C++. Следующие типы данных принимаются языком запросов:

  • символ
  • uchar
  • короткий
  • ushort
  • длинный
  • ulong
  • int
  • uint
  • longlong
  • плавать
  • двойной
  • ул.
  • 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. Без управляющего символа {char=\} будет недопустимым выражением, а {char=C} интерпретируется как строчная c. Не забудьте использовать escape-символ обратной косой черты перед всеми прописными буквами в форматах метаданных, которые чувствительны к регистру.

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

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

Выражение Описание
ifd/xmp/exif:Author Соответствует следующему пути навигации: блок IFD,> и блок XMP,>, свойство "Автор" в схеме Exif.
/[1]ifd/[0]xmp/exif:Автор То же самое, что и первый элемент в этой таблице, с тем отличием, что префикс [#] указывает, какой элемент следует выбрать в случае совпадения имен.
/ifd/{ushort=700}/Автор Аналогично первому элементу в этой таблице, за исключением того, что он использует выражение данных для ссылки на блок 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, можно использовать следующее выражение запроса:

  • Система.Оценка

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

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

Заметка

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

 

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

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

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

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

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

 

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

обзор компонента образов Windows

Обзор метаданных WIC

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

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

Инструкция: Перекодирование изображения JPEG с метаданными