Přehled čtení a zápisu metadat obrázků
Toto téma obsahuje přehled o tom, jak můžete pomocí rozhraní API pro bitovou kopii systému Windows (WIC) číst a zapisovat metadata vložená do souborů obrázků.
Toto téma obsahuje následující části.
- požadavky
- Úvod
- čtení metadat pomocí čtečky dotazů
-
Psaní metadat pomocí zapisovače dotazů
- získání zapisovače dotazů
- Přidání metadat
- Odebrání metadat
- Kopírování metadat pro opětovné kódování
-
Rychlé kódování metadat
- Přidání Odsazení do Bloků Metadat
- získání rychlého kodéru metadat
- Použití rychlého kodéru metadat
- související témata
Požadavky
Abyste pochopili toto téma, měli byste být obeznámeni se systémem metadat WIC, jak je popsáno v PŘEHLED metadat WIC. Měli byste být také obeznámeni s dotazovacím jazykem používaným ke čtení a zápisu metadat, jak je popsáno v Přehled dotazovacího jazyka metadat.
Úvod
WIC poskytuje vývojářům aplikací komponenty modelu COM (Component Object Model) ke čtení a zápisu metadat vložených do souborů obrázků. Existují dva způsoby čtení a zápisu metadat:
- Použití čtečky dotazů/zapisovače a výrazu dotazu k dotazování bloků metadat pro vnořené bloky nebo konkrétní metadata v rámci bloku.
- Použití obslužné rutiny metadat (čtenář metadat nebo zapisovač metadat) pro přístup k vnořeným blokům metadat nebo konkrétním metadatům v rámci bloků metadat.
Nejjednodušší z nich je použít čtečku dotazů/zapisovač a výraz dotazu pro přístup k metadatům. Čtečka dotazů (IWICMetadataQueryReader) slouží ke čtení metadat, zatímco zapisovač dotazů (IWICMetadataQueryWriter) slouží pro zápis metadat. Obě tyto výrazy používají výraz dotazu ke čtení nebo zápisu požadovaných metadat. Zpracovatel dotazů v zákulisí používá zpracování metadat pro přístup k metadatům popsaným výrazem dotazu.
Pokročilejší metodou je přímý přístup k zpracovatelům metadat. Obslužná rutina pro metadata je získána z jednotlivých snímků pomocí čtečky bloků (IWICMetadataBlockReader) nebo zapisovače bloků (IWICMetadataBlockWriter). Dostupné dva typy obslužných rutin metadat jsou čtečka metadat (IWICMetadataReader) a zapisovač metadat (IWICMetadataWriter).
Následující diagram obsahu souboru obrázku JPEG se používá v následujících příkladech v tomto tématu. Obrázek reprezentovaný tímto diagramem byl vytvořen pomocí aplikace Microsoft Paint; metadata hodnocení byla přidána pomocí funkce Galerie fotografií systému Windows Vista.
Čtení metadat pomocí čtečky dotazů
Nejjednodušší způsob, jak číst metadata, je použít rozhraní čtečky dotazů, IWICMetadataQueryReader. Čtečka dotazů umožňuje číst bloky metadat a položky v blocích metadat pomocí výrazu dotazu.
Existují tři způsoby, jak získat čtečku dotazů: prostřednictvím rastrového dekodéru (IWICBitmapDecoder), prostřednictvím jeho jednotlivých rámců (IWICBitmapFrameDecode), nebo prostřednictvím zapisovače dotazů (IWICMetadataQueryWriter).
Získání čtečky dotazů
Následující příklad kódu ukazuje, jak získat rastrový dekodér z objektu pro vytváření obrázků a načíst individuální rastrový rámeček. Tento kód také provádí instalační práci potřebnou k získání čtečky dotazů z dekódovaného rámce.
IWICImagingFactory *pFactory = NULL;
IWICBitmapDecoder *pDecoder = NULL;
IWICBitmapFrameDecode *pFrameDecode = NULL;
IWICMetadataQueryReader *pQueryReader = NULL;
IWICMetadataQueryReader *pEmbedReader = NULL;
PROPVARIANT value;
// Initialize COM
CoInitialize(NULL);
// Initialize PROPVARIANT
PropVariantInit(&value);
//Create the COM imaging factory
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
(LPVOID*)&pFactory);
// Create the decoder
if (SUCCEEDED(hr))
{
hr = pFactory->CreateDecoderFromFilename(
L"test.jpg",
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnDemand,
&pDecoder);
}
// Get a single frame from the image
if (SUCCEEDED(hr))
{
hr = pDecoder->GetFrame(
0, //JPEG has only one frame.
&pFrameDecode);
}
Rastrový dekodér pro soubor test.jpg je získán pomocí metody CreateDecoderFromFilename v rámci továrny pro zpracování obrázků. V této metodě je čtvrtý parametr nastaven na hodnotu WICDecodeMetadataCacheOnDemand z WICDecodeOptions výčtu. To dekodéru říká, aby metadata ukládala do mezipaměti, když jsou potřebná metadata: zajištěním čtečky dotazů nebo základní čtečky metadat. Tato možnost umožňuje zachovat datový proud do metadat požadovaných pro rychlé kódování metadat a umožňuje bezeztrátové dekódování obrázku JPEG. Alternativně můžete použít další WICDecodeOptions hodnotu WICDecodeMetadataCacheOnLoad, která ukládá metadata vložené image do mezipaměti hned po načtení image.
Chcete-li získat čtečku dotazu rámce, jednoduše zavolejte metodu rámce GetMetadataQueryReader. Následující kód ukazuje toto volání.
// Get the query reader
if (SUCCEEDED(hr))
{
hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}
Podobně lze čtenáře dotazů získat také na úrovni dekodéru. Jednoduché volání metody dekodéru GetMetadataQueryReader získá čtečku dotazů dekodéru. Čtečka dotazů dekodéru, na rozdíl od čtečky dotazů snímku, čte metadata obrázku, která jsou mimo jednotlivé snímky. Tento scénář ale není běžný a formáty nativních imagí tuto funkci nepodporují. Nativní obrazové kodeky poskytované WIC čtou a zapisují metadata na úrovni rámce, i pro formáty s jedním snímkem, jako je JPEG.
Čtení metadat
Než začnete číst metadata, podívejte se na následující diagram souboru JPEG, který obsahuje vložené bloky metadat a skutečná data, která se mají načíst. Tento diagram poskytuje popisky konkrétním blokům metadat a položkám v obrázku, přičemž ke každému bloku nebo položce přidává výraz pro dotazování metadat.
Chcete-li dotazovat vložené bloky metadat nebo konkrétní položky podle názvu, zavolejte metodu GetMetadataByName. Tato metoda přebírá výraz dotazu a PROPVARIANT, ve kterém je vrácena položka metadat. Následující kód dotazuje vnořený blok metadat a převede komponentu IUnknown poskytovanou hodnotou PROPVARIANT na čítače dotazů, pokud je najde.
if (SUCCEEDED(hr))
{
// Get the nested IFD reader
hr = pQueryReader->GetMetadataByName(L"/app1/ifd", &value);
if (value.vt == VT_UNKNOWN)
{
hr = value.punkVal->QueryInterface(IID_IWICMetadataQueryReader, (void **)&pEmbedReader);
}
PropVariantClear(&value); // Clear value for new query
}
Výraz dotazu /app1/ifd se dotazuje na blok IFD vnořený do bloku App1. Soubor obrázku JPEG obsahuje blok vnořených metadat IFD, takže je vrácen PROPVARIANT s datovým typem (vt) VT_UNKNOWN
a ukazatelem na rozhraní IUnknown (punkVal). Potom se dotazujete na rozhraní IUnknown pro čtenáře dotazů.
Následující kód ukazuje nový dotaz založený na nové čtečce dotazů vzhledem k vnořenému bloku IFD.
if (SUCCEEDED(hr))
{
hr = pEmbedReader->GetMetadataByName(L"/{ushort=18249}", &value);
PropVariantClear(&value); // Clear value for new query
}
Výraz dotazu /{ushort=18249} dotazuje blok IFD pro hodnocení MicrosoftPhoto vložený pod značkou 18249. Hodnota PROPVARIANT teď bude obsahovat typ hodnoty VT_UI2
a datovou hodnotu 50.
Před dotazováním na konkrétní datové hodnoty ale není nutné získat vnořený blok. Například místo dotazování na vnořené IFD a pak pro hodnocení MicrosoftPhoto můžete místo toho použít blok kořenových metadat a dotaz zobrazený v následujícím kódu získat stejné informace.
if (SUCCEEDED(hr))
{
hr = pQueryReader->GetMetadataByName(L"/app1/ifd/{ushort=18249}", &value);
PropVariantClear(&value);
}
Kromě dotazování na konkrétní položky metadat v bloku metadat můžete také zobrazit výčet všech položek metadat v bloku metadat (nezahrnuje položky metadat v blocích vnořených metadat). K vytvoření výčtu položek metadat v aktuálním bloku se použije metoda GetEnumeration čtenáře dotazu. Tato metoda získá rozhraní IEnumString, které je naplněné položkami metadat v aktuálním bloku. Například následující kód vyjmenuje hodnocení XMP a hodnocení MicrosoftPhoto pro vnořený blok IFD, který byl získán dříve.
IEnumString *metadataItems = NULL;
if (SUCCEEDED(hr))
{
hr = pEmbedReader->GetEnumerator(&metadataItems);
}
Další informace o identifikaci vhodných značek pro různé formáty obrázků a formáty metadat naleznete v tématu Dotazy metadat formátu nativních obrázků.
Další metody čtečky dotazů
Kromě čtení metadat můžete také získat další informace o čtečce dotazů a získat metadata jinými prostředky. Čtečka dotazů poskytuje dvě metody, které poskytují informace o čtečkě dotazů, GetContainerFormat a GetLocation.
S vloženou čtečkou dotazů můžete použít GetContainerFormat k určení typu bloku metadat a můžete použít GetLocation pro získání cesty vzhledem k bloku kořenových metadat. Následující kód se dotazuje čtečky vloženého dotazu na jeho umístění.
// Determine the metadata block format
if (SUCCEEDED(hr))
{
hr = pEmbedReader->GetContainerFormat(&containerGUID);
}
// Determine the query reader's location
if (SUCCEEDED(hr))
{
UINT length;
WCHAR readerNamespace[100];
hr = pEmbedReader->GetLocation(100, readerNamespace, &length);
}
Volání funkce GetContainerFormat pro čtečku vložených dotazů vrátí identifikátor GUID formátu metadat IFD. Volání GetLocation vrátí obor názvů "/app1/ifd"; poskytuje relativní cestu, ze které se budou provádět následné dotazy pro novou čtečku dotazů. Samozřejmě, předchozí kód není velmi užitečný, ale ukazuje, jak použít metodu GetLocation pro hledání vnořených bloků metadat.
Zápis metadat pomocí zapisovače dotazů
Poznámka
Některé příklady kódu uvedené v této části se nezobrazují v kontextu skutečných kroků potřebných k zápisu metadat. Pokud chcete zobrazit příklady kódu v kontextu funkční ukázky, podívejte se na kurz Postupy: Opětovné kódování obrázku s metadaty.
Hlavní komponentou pro zápis metadat je zapisovač dotazů (IWICMetadataQueryWriter). Zapisovač dotazů umožňuje nastavit a odebrat bloky metadat a položky v rámci bloku metadat.
Stejně jako čtečka dotazů existují tři způsoby, jak získat zapisovač dotazů: prostřednictvím rastrového kodéru (IWICBitmapEncoder), prostřednictvím jednotlivých snímků (IWICBitmapFrameEncode), nebo prostřednictvím rychlého kodéru metadat (IWICFastMetadataEncoder).
Získání zapisovače dotazů
Nejběžnějším zapisovačem dotazů je individuální rámec rastrového obrázku. Tento zapisovač dotazů nastaví a odebere bloky a položky metadat rámce obrázku. Chcete-li získat zapisovač dotazu pro rámec obrázku, zavolejte metodu rámce GetMetadataQueryWriter. Následující kód ukazuje jednoduché volání metody pro získání zapisovače dotazu rámce.
IWICMetadataQueryWriter &pFrameQWriter = NULL;
//Obtain a query writer from the frame.
hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
Podobně lze zapisovač dotazů získat také pro úroveň kodéru. Jednoduché volání metody GetMetadataQueryWriter kodéru slouží k získání zapisovače dotazů kodéru. Zapisovač dotazů kodéru, na rozdíl od zapisovače dotazu rámce, zapisuje metadata obrázku mimo jednotlivý rámec. Tento scénář ale není běžný a formáty nativních imagí tuto funkci nepodporují. Kodeky nativní obrazu poskytované WIC čtou a zapisují metadata na úrovni snímku, a to i pro formáty s jedním snímkem, jako je JPEG.
Můžete také získat zapisovač dotazů přímo z objektu pro vytváření obrázků (IWICImagingFactory). Existují dvě metody vytváření obrázků, které vracejí zapisovač dotazů: CreateQueryWriter a CreateQueryWriterFromReader.
CreateQueryWriter vytvoří zapisovač dotazu pro zadaný formát metadat a dodavatele. Tento zapisovač dotazů umožňuje zapisovat metadata pro určitý formát metadat a přidat je do obrázku. Následující kód ukazuje volání CreateQueryWriter pro vytvoření tvůrce dotazů XMP.
IWICMetadataQueryWriter *pXMPWriter = NULL;
// Create XMP block
GUID vendor = GUID_VendorMicrosoft;
hr = pFactory->CreateQueryWriter(
GUID_MetadataFormatXMP,
&vendor,
&pXMPWriter);
V tomto příkladu se přátelský název GUID_MetadataFormatXMP
používá jako parametr guidMetadataFormat. Představuje identifikátor GUID formátu metadat XMP a dodavatel představuje obslužnou rutinu vytvořenou microsoftem. Alternativně null lze předat jako parametr pguidVendor se stejnými výsledky, pokud neexistuje žádná jiná obslužná rutina XMP. Pokud je vedle nativní obslužné rutiny XMP nainstalovaná vlastní obslužná rutina XMP, předání null dodavateli způsobí, že se zapisovač dotazu vrátí s nejnižším identifikátorem GUID.
CreateQueryWriterFromReader se podobá metodě CreateQueryWriter s tím rozdílem, že předvyplní nový zapisovač dotazu daty poskytnutými čtenářem dotazu. To je užitečné při opětovném kódování obrázku při zachování existujících metadat nebo při odebírání nežádoucích metadat. Následující kód ukazuje volání CreateQueryWriterFromReader.
hr = pFrameDecode->GetMetadataQueryReader(&pFrameQReader);
// Copy metadata using query readers
if(SUCCEEDED(hr) && pFrameQReader)
{
IWICMetadataQueryWriter *pNewWriter = NULL;
GUID vendor = GUID_VendorMicrosoft;
hr = pFactory->CreateQueryWriterFromReader(
pFrameQReader,
&vendor,
&pNewWriter);
Přidání metadat
Po získání zapisovače dotazu ho můžete použít k přidání bloků metadat a položek. K zápisu metadat použijete metodu zapisovače dotazu SetMetadataByName. SetMetadataByName má dva parametry: výraz dotazu (wzName) a ukazatel na PROPVARIANT (pvarValue). Výraz dotazu definuje blok nebo položku, která se má nastavit, zatímco PROPVARIANT poskytuje skutečnou datovou hodnotu, kterou chcete nastavit.
Následující příklad ukazuje, jak přidat název pomocí zapisovače dotazů XMP, který byl dříve získán pomocí metody CreateQueryWriter.
// Write metadata to the XMP writer
if (SUCCEEDED(hr))
{
PROPVARIANT value;
PropVariantInit(&value);
value.vt = VT_LPWSTR;
value.pwszVal = L"Metadata Test Image.";
hr = pXMPWriter->SetMetadataByName(L"/dc:title", &value);
PropVariantClear(&value);
}
V tomto příkladu je typ hodnoty (vt) nastaven na VT_LPWSTR
, což označuje, že řetězec se použije jako datová hodnota. Protože typ hodnoty je řetězec, pwszVal se používá k nastavení názvu.
SetMetadataByName se pak volá pomocí výrazu dotazu "/dc:title" a nově nastaveného PROPVARIANT. Použitý výraz dotazu označuje, že vlastnost názvu ve schématu digitálního fotoaparátu (DC) by měla být nastavena. Všimněte si, že výraz není "/xmp/dc:title"; důvodem je to, že zapisovač dotazu je již specifický pro XMP a neobsahuje vložený blok XMP, který by "/xmp/dc:title" navrhl.
Do tohoto okamžiku jste do rámečku obrázku ve skutečnosti nepřidali žádná metadata. Jednoduše jste naplnili zapisovač dotazů daty. Pokud chcete přidat do rámce blok metadat reprezentovaný zapisovačem dotazu, znovu zavoláte SetMetadataByName pomocí zapisovače dotazu jako hodnotu PROPVARIANT. Tím se metadata v zapisovači dotazů zkopírují do rámce obrázku. Následující kód ukazuje, jak přidat metadata v zapisovači dotazu XMP dříve získané do bloku kořenových metadat rámce.
// Get the frame's query writer and write the XMP query writer to it
if (SUCCEEDED(hr))
{
hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
// Copy the metadata in the XMP query writer to the frame
if (SUCCEEDED(hr))
{
PROPVARIANT value;
PropVariantInit(&value);
value.vt = VT_UNKNOWN;
value.punkVal = pXMPWriter;
value.punkVal->AddRef();
hr = pFrameQWriter->SetMetadataByName(L"/", &value);
PropVariantClear(&value);
}
}
V tomto příkladu se použije typ hodnoty (vt) VT_UNKOWN
, označující typ hodnoty rozhraní COM. Zapisovač dotazů XMP (piXMPWriter) se pak použije jako hodnota PROPVARIANT, přidáním odkazu na něj pomocí metody AddRef. Nakonec se zapisovač dotazu XMP nastaví voláním SetMetadataByName metody rámce a předáním výrazu dotazu "/", který označuje kořenový blok a nově nastavený PROPVARIANT.
Poznámka
Pokud už rámec obsahuje blok metadat, který se pokoušíte přidat, přidá se metadata, která přidáváte, a existující metadata se přepíšou.
Odebrání metadat
Zapisovač dotazů také umožňuje odebrat metadata voláním metody RemoveMetadataByName. RemoveMetadataByName vezme výraz dotazu a odebere blok metadat nebo položku, pokud existuje. Následující kód ukazuje, jak odebrat název, který byl dříve přidán.
if (SUCCEEDED(hr))
{
hr = pFrameQWriter->RemoveMetadataByName(L"/xmp/dc:title");
}
Následující kód ukazuje, jak odebrat celý blok metadat XMP.
if (SUCCEEDED(hr))
{
hr = pFrameQWriter->RemoveMetadataByName(L"/xmp");
}
Kopírování metadat pro opětovné kódování
Poznámka
Kód v této části je platný pouze v případě, že jsou stejné formáty zdrojové a cílové image. Při kódování do jiného formátu obrázku nelze zkopírovat všechna metadata obrázku v jedné operaci.
Chcete-li zachovat metadata při opětovném kódování obrázku do stejného formátu obrázku, jsou k dispozici metody pro kopírování všech metadat v jedné operaci. Každá z těchto operací sleduje podobný vzor; každá nastaví metadata dekódovaného rámce přímo do nového rámce, který je enkódován.
Upřednostňovanou metodou kopírování metadat je inicializace zapisovače bloků nového rámce pomocí čtečky bloků dekódovaného rámce. Následující kód ukazuje tuto metodu.
if (SUCCEEDED(hr) && formatsEqual)
{
// Copy metadata using metadata block reader/writer
if (SUCCEEDED(hr))
{
pFrameDecode->QueryInterface(
IID_IWICMetadataBlockReader,
(void**)&pBlockReader);
}
if (SUCCEEDED(hr))
{
pFrameEncode->QueryInterface(
IID_IWICMetadataBlockWriter,
(void**)&pBlockWriter);
}
if (SUCCEEDED(hr))
{
pBlockWriter->InitializeFromBlockReader(pBlockReader);
}
}
V tomto příkladu jsou čtenář bloku a zapisovač bloku získávány ze zdrojového rámce a cílového rámce. Blokový zapisovač se pak inicializuje z blokového čtecího zařízení. Tím se inicializuje čtečka bloků pomocí předem vyplněných metadat čtečky bloků.
Další metodou kopírování metadat je zapsat blok metadat, na který odkazuje čtenář dotazů, pomocí zapisovače dotazů kodéru. Následující kód ukazuje tuto metodu.
if (SUCCEEDED(hr) && formatsEqual)
{
hr = pFrameDecode->GetMetadataQueryReader(&pFrameQReader);
// Copy metadata using query readers
if(SUCCEEDED(hr))
{
hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
if (SUCCEEDED(hr))
{
PropVariantClear(&value);
value.vt=VT_UNKNOWN;
value.punkVal=pFrameQReader;
value.punkVal->AddRef();
hr = pFrameQWriter->SetMetadataByName(L"/", &value);
PropVariantClear(&value);
}
}
}
Zde se čtečka dotazů získá z dekódovaného rámce a pak se použije jako hodnota vlastnosti PROPVARIANT s typem hodnoty nastaveným na VT_UNKNOWN. Zapisovač dotazu pro kodér se získá a výraz dotazu "/" slouží k nastavení metadat v kořenové navigační cestě. Tuto metodu můžete použít také při nastavování vnořených bloků metadat úpravou výrazu dotazu na požadované umístění.
Podobně můžete vytvořit zapisovač dotazů na základě čtečky dotazů dekódovaného rámce pomocí metody CreateQueryWriterFromReader z imaging factory. Zapisovač dotazů vytvořený v této operaci bude předem vyplněný metadaty ze čtečky dotazů a pak se dá nastavit v rámci. Následující kód ukazuje operaci kopírování CreateQueryWriterFromReader.
IWICMetadataQueryWriter *pNewWriter = NULL;
GUID vendor = GUID_VendorMicrosoft;
hr = pFactory->CreateQueryWriterFromReader(
pFrameQReader,
&vendor,
&pNewWriter);
if (SUCCEEDED(hr))
{
// Get the frame's query writer
hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
}
// Set the query writer to the frame.
if (SUCCEEDED(hr))
{
PROPVARIANT value;
PropVariantInit(&value);
value.vt = VT_UNKNOWN;
value.punkVal = pNewWriter;
value.punkVal->AddRef();
hr = pFrameQWriter->SetMetadataByName(L"/",&value);
}
Tato metoda používá samostatný zapisovač dotazů, který je založený na datech čtečky dotazů. Tento nový zapisovač dotazů se pak nastaví v rámci.
Tyto operace pro kopírování metadat opět fungují pouze v případě, že zdrojové a cílové image mají stejný formát. Důvodem je to, že různé formáty obrázků ukládají bloky metadat v různých umístěních. Například jpeg i TIFF podporují bloky metadat XMP. V obrázcích JPEG je blok XMP v kořenovém bloku metadat, jak je znázorněno v WIC přehledu metadat . Na obrázku TIFF je však blok XMP vnořen do kořenového bloku IFD. Následující diagram znázorňuje rozdíly mezi obrázkem JPEG a obrázkem TIFF se stejnými metadaty hodnocení.
Rychlé kódování metadat
Není vždy nutné překódovat obrázek pro zápis nových metadat do něj. Metadata lze také zapsat pomocí rychlého kodéru metadat. Kodér rychlých metadat může na obrázek napsat omezené množství metadat bez opětovného kódování obrázku. Toho se dosahuje zápisem nových metadat do prázdného prostoru, který poskytují některé formáty metadat. Nativní formáty metadat, které podporují odsazení metadat, jsou Exif, IFD, GPS a XMP.
Přidání odsazení do bloků metadat
Než budete moct provádět rychlé kódování metadat, musí být v bloku metadat prostor pro zápis dalších metadat. Pokud v existujícím odsazení není dostatek místa pro zápis nových metadat, rychlost kódování metadat selže. Pokud chcete do obrázku přidat odsazení metadat, musí být obrázek znovu zakódován. Pokud blok metadat podporuje odsazení, můžete jej přidat stejným způsobem jako jakoukoli jinou položku metadat pomocí dotazovacího výrazu. Následující příklad ukazuje, jak přidat výplň do bloku IFD vloženého do bloku APP1.
if (SUCCEEDED(hr))
{
// Add metadata padding
PROPVARIANT padding;
PropVariantInit(&padding);
padding.vt = VT_UI4;
padding.uiVal = 4096; // 4KB
hr = pFrameQWriter->SetMetadataByName(L"/app1/ifd/PaddingSchema:padding", &padding);
PropVariantClear(&padding);
}
Pokud chcete přidat odsazení, vytvořte PROPVARIANT typu VT_UI4 a hodnotu odpovídající počtu bajtů odsazení, které chcete přidat. Typická hodnota je 4096 bajtů. V této tabulce jsou dotazy na metadata pro JPEG, TIFF a JPEG-XR.
Formát metadat | Dotaz metadat JPEG | Dotaz na metadata TIFF JPEG-XR |
---|---|---|
IFD | /app1/ifd/PaddingSchema:Padding | /ifd/PaddingSchema:Vyplnění |
EXIF | /app1/ifd/exif/PaddingSchema:Padding | /ifd/exif/PaddingSchema:Padding |
XMP | /xmp/PaddingSchema:Padding | /ifd/xmp/PaddingSchema:Padding |
GPS | /app1/ifd/gps/PaddingSchema:Padding | /ifd/gps/PaddingSchema:Odsazení |
Získání rychlého kodéru metadat
Pokud máte obrázek s odsazením metadat, lze rychlý kodér pro metadata získat pomocí metod továrny na zpracování obrázků CreateFastMetadataEncoderFromDecoder a CreateFastMetadataEncoderFromFrameDecode.
Jak už název napovídá, CreateFastMetadataEncoderFromDecoder vytvoří rychlý kodér metadat pro metadata na úrovni dekodéru. Formáty nativních imagí poskytované WIC nepodporují metadata na úrovni dekodéru, ale tato metoda je k dispozici v případě, že je takový formát obrázku vyvinut v budoucnu.
Nejběžnějším scénářem je získání rychlého kodéru metadat z rámce obrázku pomocí CreateFastMetadataEncoderFromFrameDecode. Následující kód získá rychlý kodér metadat dekódovaného snímku a změní hodnotu hodnocení v bloku App1.
if (SUCCEEDED(hr))
{
IWICFastMetadataEncoder *pFME = NULL;
IWICMetadataQueryWriter *pFMEQW = NULL;
hr = pFactory->CreateFastMetadataEncoderFromFrameDecode(
pFrameDecode,
&pFME);
}
Použití rychlého kodéru metadat
Z rychlého kodéru metadat můžete získat zapisovač dotazů. To umožňuje psát metadata pomocí výrazu dotazu, jak jsme si ukázali dříve. Po nastavení metadat v nástroji pro tvorbu dotazů potvrďte rychlý kodér metadat, aby se dokončila aktualizace metadat. Následující kód ukazuje nastavení a potvrzení změn metadat.
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();
}
}
Pokud Potvrzení z nějakého důvodu selže, budete muset obrázek znovu zakódovat, abyste zajistili přidání nových metadat do obrázku.
Související témata
-
Koncepční
-
Přehled komponent Windows Imaging