Omówienie języka zapytań metadanych
W tym temacie przedstawiono język zapytań metadanych dla składnika Windows Imaging (WIC). Język zapytań metadanych służy do tworzenia wyrażeń, które znajdują określone dane (elementy metadanych) i lokalizacje (bloki metadanych) w metadanych obrazu.
Ten temat zawiera następujące sekcje.
- wymagania wstępne
- Wprowadzenie
- Anatomia wyrażenia ścieżki
- Polityka wyrażania metadanych zdjęć
- Podsumowanie języka zapytań metadanych
- Tematy pokrewne
Warunki wstępne
Aby zrozumieć ten temat, należy zapoznać się z systemem metadanych WIC zgodnie z opisem w Omówienie Metadanych WIC oraz z uzyskiwaniem dostępu do metadanych, zgodnie z opisem w Omówienie Odczytywania i Zapisywania Metadanych Obrazu.
Wprowadzenie
Interakcja z platformą metadanych odbywa się głównie za pośrednictwem dwóch składników modelu obiektów składników (COM): czytnika zapytań reprezentowanego przez interfejsIWICMetadataQueryReader oraz moduł zapisywania zapytań reprezentowany przez interfejs IWICMetadataQueryWriter. Te składniki umożliwiają odczytywanie lub zapisywanie metadanych przy użyciu języka zapytań metadanych. Język zapytań opisuje składnię wyrażenia ścieżki, a składniki zapytania używają tego wyrażenia ścieżki do uzyskiwania dostępu do żądanych metadanych. To wyrażenie ścieżki opisuje lokalizację bloku metadanych lub elementu.
Blok metadanych jest nazwaną grupą metadanych w określonym formacie. Blok metadanych może zawierać poszczególne elementy metadanych, takie jak autor lub czas tworzenia, a także dodatkowe bloki metadanych. Nazwa bloku metadanych jest określana przez jego format. Na przykład blok metadanych zawierający metadane App1 będzie miał nazwę "app1". Typowe formaty metadanych obejmują App1, Exif, IFD i XMP.
Element metadanych jest parą nazwa/wartość, która opisuje cechy, takie jak autor, tytuł i ocena.
Wyrażenie ścieżki zawiera co najmniej jedną nazwę bloku metadanych. Może również określać element metadanych w bloku metadanych. Następujące wyrażenie ścieżki reprezentuje blok App1, który zawiera blok IFD zawierający element metadanych:
- /app1/ifd/{ushort=18249}
Na poniższym diagramie przedstawiono makijaż przykładowego obrazu JPEG z czterema głównymi blokami metadanych: App0, App1, XMP i nieznanym blokiem. Każdy wyróżniony element zwraca uwagę na typ metadanych (blok lub element) i wyrażenie zapytania używane do pobierania danych.
Notatka
Zawartość tego diagramu jest używana w wielu przykładach w tym dokumencie.
Anatomia wyrażenia ścieżki
Aby uzyskać dostęp do metadanych przy użyciu interfejsów API WIC, w większości przypadków musi być używane w pełni kwalifikowane wyrażenie zapytania. W tym temacie omówiono w pełni kwalifikowane wyrażenia na potrzeby uzyskiwania dostępu do metadanych. Jeśli potrzebujesz informacji na temat przypadków, w których niew pełni kwalifikowane wyrażenia są używane, zapoznaj się z sekcją Wyrażenie zasad metadanych zdjęć w dalszej części tego dokumentu.
Co to jest w pełni kwalifikowane wyrażenie zapytania? W WIC, wyrażenie w pełni kwalifikowane jest ciągiem rozpoczynającym się od znaku ścieżki ukośnika (/), po którym następuje ścieżka do bloku metadanych lub określonego elementu metadanych. Każdy krok w ścieżce nawigacji jest oddzielony ukośnikiem, tworząc wyrażenie dostępu do bloku metadanych lub elementu metadanych. Na przykład, poniżej przedstawiono w pełni kwalifikowane wyrażenie zapytania, które uzyskuje dostęp do Microsoft Photo Rating w bloku IFD osadzonym w bloku App1:
- /app1/ifd/{ushort=18249}
Gdy funkcja WIC analizuje to wyrażenie, najpierw wyszukuje blok metadanych App1 w metadanych obrazu. Jeśli blok App1 zostanie znaleziony, kontynuuje wyszukiwanie, szukając zagnieżdżonego bloku metadanych IFD. Jeśli blok IFD zostanie znaleziony, program szuka określonego elementu metadanych, w tym przypadku oceny MicrosoftPhoto, znajdującej się pod tagiem 18249 w bloku metadanych IFD. Jeśli w dowolnym momencie WIC nie znajdzie bloku metadanych ani elementu, przerywa zapytanie.
Blokuj zaznaczenie
Najprostsze wyrażenie zapytania metadanych WIC to wyrażenie służące do uzyskiwania czytnika/zapisywania zapytań dla określonego bloku metadanych. Uzyskanie czytnika/modułu zapisu zapytań umożliwia przesyłanie kolejnych zapytań bezpośrednio do zagnieżdżonego bloku metadanych bez konieczności obsługi bloku nadrzędnego. Wyrażenie zapytania wyboru bloku jest ścieżką nawigacji do żądanego bloku metadanych. Na przykład na poprzedniej ilustracji istnieje pięć bloków metadanych, z których dwa są zagnieżdżone w innych blokach metadanych. Poniżej przedstawiono wyrażenia ścieżki do każdego bloku metadanych w przykładzie JPEG:
- /app0
- /app1
- /app1/ifd
- /app1/ifd/exif
- /xmp
Gdy używasz czytnika/modułu zapisywania zapytań do wykonywania zapytania, zwraca on nowy czytnik/składnik zapisywania zapytań, który wykonuje zapytania w zakresie określonego bloku metadanych. Jeśli na przykład wykonasz zapytanie "/app1", zostanie uzyskany nowy czytnik zapytań, a zapytania do nowego czytelnika są względem bloku App1. Oznacza to, że zapytanie "/ifd" jest prawidłowe dla nowego czytelnika, ponieważ blok App1 zawiera blok IFD. Jednak "/xmp" nie będzie działać, ponieważ ten blok App1 nie zawiera bloku metadanych XMP.
Język zapytań obsługuje również notację indeksu. Notacja indeksu zapewnia dostęp do określonego bloku metadanych, gdy istnieje wiele bloków tego samego typu. W przykładzie JPEG można użyć następującego wyrażenia ścieżki indeksowanej:
- /[0]app1/[0]ifd
W języku zapytań wszystkie indeksy zaczynają się od zera. W poprzednim wyrażeniu pierwsze zero zapytuje o pierwszy blok App1, a drugie zero zapytuje o pierwszy zagnieżdżony blok IFD. Notacja indeksu może być nadal używana nawet wtedy, gdy wiele bloków tego samego typu nie istnieje. Jeśli przykładowy plik JPEG zawierał drugi blok App1 z osadzonym blokiem IFD, wyrażenie "/[1]app1/ifd" będzie używane do uzyskiwania dostępu do drugiego bloku App1.
Notacja indeksu staje się częściej spotykana w przypadku fragmentów png tEXt, ponieważ prawdopodobnie obraz PNG będzie miał więcej niż jeden fragment tEXt.
Notatka
Indeksy tablic wielowymiarowych nie są obsługiwane.
Wybór elementu
Dostęp do elementów metadanych w bloku metadanych można uzyskać, opierając się na wyrażeniach wyboru bloku. Rozważ właściwości klasyfikacji zdjęć XMP i Microsoft w przykładzie JPEG. Te metadane istnieją w dwóch blokach metadanych: blokach App1/IFD i XMP. W związku z tym więcej niż jedno wyrażenie może służyć do uzyskiwania dostępu do tych samych danych. Następujące wyrażenie uzyskuje dostęp do klasyfikacji MicrosoftPhoto w bloku XMP:
- /xmp/xmp:Ocena
Część wyrażenia "xmp:" jest identyfikatorem zgodnym ze schematem. XMP to rozszerzalny standard i umożliwia podmiotom innych firm publikowanie własnych schematów, które definiują sposób przechowywania niektórych elementów metadanych. Schemat XMP jest w pełni identyfikowany przez adres URL, ale WIC udostępnia zestaw przyjaznych identyfikatorów dla dobrze znanych schematów. Aby uzyskać więcej informacji, zobacz temat Native Image Format Metadata Queries (Zapytania metadanych w formacie obrazu natywnego).
W przypadku obrazów JPEG informacje o klasyfikacji mogą być także przechowywane w bloku IFD zagnieżdżonym w App1. Jednak w przeciwieństwie do przykładu klasyfikacji XMP blok IFD nie używa nazwy schematu w celu uzyskania dostępu do informacji o klasyfikacji. Zamiast tego należy użyć wyrażenia danych. Następujące wyrażenie służy do uzyskiwania dostępu do oceny MicrosoftPhoto w zagnieżdżonym bloku IFD App1:
- /app1/ifd/{ushort=18249}
W tym wyrażeniu część "/app1/ifd" jest ścieżką nawigacji do bloku IFD (zgodnie z wcześniej podanym opisem w sekcji Wybór Bloku). Druga część wyrażenia "/{ushort=18249}" uzyskuje dostęp do danych. Ta część wyrażenia instruuje analizatora zapytań, aby znaleźć dane osadzone w niepodpisanym krótkim tagu, który ma identyfikator tagu 18249.
Notatka
Listę typowych formatów metadanych obsługiwanych przez poszczególne formaty obrazów można znaleźć w temacie Native Image Format Metadata Queries (Zapytania metadanych formatu obrazu natywnego).
{ushort=18249} jest wyrażeniem danych i może przyjmować kilka formularzy. Wyrażenie danych to dwuczęściowe wyrażenie zawierające żądany tag metadanych lub klucz, w tym przypadku "18249" i typ danych klucza, w tym przypadku "ushort". Obie części są oddzielone znakiem równości (=). Usługa WIC wspiera większość typowych typów danych C/C++. Następujące typy danych są akceptowane przez język zapytań:
- Char
- uchar
- krótki
- ushort
- długi
- ulong
- Int
- uint
- longlong
- unosić się
- podwójny
- Str
- wstr
- guid
- bool
Notatka
Ta lista określa tylko typy danych obsługiwane przez język zapytań metadanych. Użyj tych typów danych podczas tworzenia wyrażenia danych zapytania metadanych, takiego jak {ushort=18249}. Funkcja WIC zwraca wartość elementu metadanych w postaci PROPVARIANT, która definiuje własny system typów.
W przykładzie "18249" jest tagiem danych. Ta określona liczba jest definiowana przez firmę Microsoft, aby zawierała ocenę MicrosoftPhoto. Tag danych może być dowolną liczbą, ciągiem lub identyfikatorem GUID w zależności od szukanego elementu danych
W przeciwieństwie do przykładu oceny XMP, nie występuje konflikt nazwy dla wartości oceny w bloku App1/IFD. Wynika to z faktu, że wartość klasyfikacji XMP jest rzeczywiście przechowywana w ramach innego tagu ushort, 18246. Zatem wyrażenie, aby uzyskać dostęp do oceny XMP w bloku App1/IFD, to:
- /app1/ifd/{ushort=18246}
Notatka
Aby zapoznać się z formalnym opisem języka zapytań metadanych, zobacz sekcję Podsumowanie języka zapytań metadanych w dalszej części tego dokumentu.
Znak ucieczki
Język zapytań nie uwzględnia wielkości liter i traktuje wszystkie znaki jako małe litery. Jednak w niektórych formatach metadanych (takich jak XMP) wielkość liter ma znaczenie. Podczas pracy z formatem metadanych, w którym jest rozróżniana wielkość liter, użyj znaku ukośnika odwrotnego (\), jeśli chcesz wskazać wielki znak.
Znak ucieczki jest używany przez analizator języka i następujący znak, który następuje po nim, jest interpretowany bezpośrednio. Na przykład wyrażenie {char=\\} jest rozpoznawane jako "\", a element {char=\C} jest rozpoznawany jako wielkie litery C. Bez znaku ucieczki {char=\} byłoby nieprawidłowe wyrażenie, a wyrażenie {char=C} byłoby interpretowane jako małe litery c. Pamiętaj, aby użyć ukośnika odwrotnego jako znaku specjalnego przed wszystkimi wielkimi literami w formatach metadanych, gdzie rozróżniana jest wielkość liter.
Przykładowe wyrażenia
W poniższej tabeli przedstawiono przykładowe wyrażenia i opisy ich interpretacji przez analizator języka zapytań.
Wyrażenie | Opis |
---|---|
ifd/xmp/exif:Author | Odpowiada następującej ścieżce nawigacji: blok IFD, blok XMP>,> i właściwość "Author" w schemacie "Exif". |
/[1]ifd/[0]xmp/exif:Autor | Taki sam jak pierwszy element w tej tabeli, z tą różnicą, że prefiks [#] opisuje, który element ma nawigować w przypadku kolizji nazw. |
/ifd/{ushort=700}/Autor | Taki sam jak pierwszy element w tej tabeli, z tą różnicą, że używa wyrażenia danych do odwoływania się do bloku XMP zamiast nazwy bloku "xmp" (blok XMP jest osadzony pod niepodpisanym krótkim identyfikatorem tagu 700). Ponadto właściwość "Author" nie określa schematu. Analizator zapytań spróbuje dopasować właściwość we wszystkich schematach i zwróci pierwsze dopasowanie. |
/ifd/xmp | Udostępnia ścieżkę nawigacji do bloku metadanych. Jeśli blok zostanie znaleziony, zostanie zwrócony nowy czytnik/składnik zapisywania metadanych. |
/[*]tEXt/Słowo kluczowe | Pobiera lub ustawia właściwość Słowo kluczowe dla fragmentu PNG. Ponieważ specyfikacja metadanych PNG zezwala na wiele fragmentów określonego typu, notacja [*] pobiera/ustawia fragment danych PNG z odpowiednią właściwością. Zgodnie ze specyfikacją PNG żadne dwa fragmenty nie mogą mieć tych samych właściwości. |
Każdy blok metadanych jest również jednoznacznie identyfikowany przez identyfikator GUID metadanych, którego można używać zamiast przyjaznej nazwy bloku. Następująca składnia może być używana zamiast podawania nazw bloków: "/{guid=GUID}/[n]{guid=GUID}/schema:tagidentifier"
Poniższa tabela zawiera kilka nieprawidłowych przykładów i przyczyny ich odrzucenia.
Nieprawidłowe wyrażenie | Opis odrzucenia |
---|---|
/ifd/[0][2]exif/ | Odrzucono, ponieważ wielowymiarowe indeksy tablic nie są obsługiwane. |
/ifd/{ushort=1}/{ushort=2} | Odrzucono, chyba że IFD ma tagID=1, który jest obsługą metadanych zawierającą element metadanych o identyfikatorze tagID=2. |
/{ushort=1} | Zapytanie zostaje odrzucone, jeśli przetwarzanie zapytania odnosi się do najwyższego poziomu w hierarchii metadanych. Wynika to z faktu, że najwyższy poziom zawiera tylko bloki metadanych, a nie elementy danych. |
Wyrażenia zasad metadanych zdjęć
Jak wspomniano wcześniej, w pełni kwalifikowane wyrażenie zapytania rozpoczyna się ukośnikiem (/). Wyrażenia, które nie zaczynają się od ukośnika, są oceniane jako wyrażenia zasad. Wyrażenie zasad umożliwia zapytania dotyczące metadanych zdjęć w odniesieniu do właściwości powłoki systemu Windows . W sekcji Wybór danych we wcześniejszej części tego dokumentu wyrażenie "/xmp/xmp:Rating" zostało użyte do uzyskania dostępu do właściwości klasyfikacji XMP. Tę właściwość można również odpytować przy użyciu następującego wyrażenia zasad:
- System.SimpleRating
Aby uzyskać dostęp do właściwości ratingu ze schematu MicrosoftPhoto, można użyć następującego wyrażenia zapytania:
- System.Ocena
Wyrażenia zasad metadanych zdjęć działają inaczej niż w pełni kwalifikowane zapytania metadanych w kilku zauważalnych aspektach.
Najpierw podczas uzyskiwania dostępu do metadanych przy użyciu wyrażenia zasad funkcja WIC wykonuje arbitraż i rozwiązanie konfliktów w przypadku, gdy ta sama właściwość jest dostępna w wielu blokach metadanych. Na przykład wartości klasyfikacji MicrosoftPhoto i XMP są przechowywane zarówno w bloku App1/IFD, jak i w bloku XMP. Zasady dotyczące metadanych zdjęć określają, która wartość bloku ma pierwszeństwo przy odczytywaniu metadanych. Podczas pisania metadanych zasady metadanych zdjęć zapewniają spójność tych samych właściwości w różnych blokach. Jeśli używasz zapytania metadanych, takiego jak "/xmp/xmp:Rating", odpowiadasz za arbitrowanie między różnymi lokalizacjami metadanych.
Notatka
Aby uzyskać listę obsługiwanych wyrażeń zasad i ich zasad mapowania, zobacz temat Zasady metadanych zdjęć.
Po drugie, wyrażenia zasad metadanych zdjęć są niezależne od formatu obrazu, podczas gdy kompleksowe zapytania o metadane nie są. Na przykład zapytanie "/xmp/xmp:Rating" jest specyficzne dla formatu JPEG. Obrazy TIFF obsługują również metadane XMP, ale są przechowywane inaczej w porównaniu z plikiem JPEG, więc zapytanie TIFF będzie miało wartość "/ifd/xmp/xmp:Rating". Jednak w obu przypadkach wyrażenie zasad będzie miało wartość "System.SimpleRating".
Wyrażenia zasad metadanych zdjęć zapewniają wyższy poziom abstrakcji i prostoty w porównaniu z w pełni kwalifikowanymi zapytaniami metadanych, dlatego powinny być preferowane w przypadkach, gdy dostęp do metadanych niskiego poziomu nie jest wymagany. Jednak wyrażenia zasad zapewniają dostęp tylko do ograniczonego zestawu metadanych obrazu, natomiast język zapytań metadanych zapewnia dostęp do prawie wszystkich metadanych przechowywanych w pliku obrazu.
Podsumowanie języka zapytań metadanych
Poniższa tabela zawiera formalną definicję języka zapytań metadanych WIC. Każdy symbol gramatyki reprezentuje wyrażenie złożone z innych symboli. Wyrażenie może być innym symbolem lub sekwencją innych symboli oddzielonych pionowym paskiem (|), wskazującym wybór "lub". Całe wyrażenie po prawej stronie jest możliwym zastąpieniem określonego symbolu po lewej stronie.
Symbol | Wyrażenie |
---|---|
<ścieżka> | <nazwa> | '/' <ścieżka właściwości> |
<ścieżka właściwości> | <element metadanych> | ścieżka właściwości od <> do <> |
<elementu metadanych> | <nazwa indeksu> | <nazwa elementu> | nazwa schematu <> ":" <nazwa elementu> |
<nazwa schematu> | <nazwa elementu> |
<nazwa elementu> | <element metadanych> | <element indeksowany><indeks> |
<indeksowany element> | <element> | <implikowane metadane><element> |
<implikowane metadane> | '<'<nazwa>'>' |
<element> | <nazwa> | &indeks><dane> | <dane> |
<dane> | '{' <Typ danych> '=' <wartość> '}' |
& |
"[" <liczba> | <gwiazda> "]" |
<typ danych> | 'char' | 'uchar' | 'short' | 'ushort' | 'long' | 'ulong' | 'int' | 'uint' | 'longlong' | 'ulonglong' | 'float' | 'double' | 'str' | 'wstr' | 'guid' | 'bool' |
<wartość danych> | <liczba> | <nazwa> | <guid> |
<gwiazda> | '*' |
<numer> | numer |
<nazwa> | struna |
> guid < | guid |
Tematy pokrewne
-
koncepcyjny
-
Instrukcje: ponowne kodowanie obrazu JPEG przy użyciu metadanych