WIC メタデータの概要

このトピックでは、Windows イメージング コンポーネント (WIC) によって提供されるイメージング メタデータのサポートについて説明します。 画像メタデータの読み取りと書き込みの概要、メタデータ クエリ言語、メタデータ ハンドラーの拡張性について説明します。

画像メタデータは、画像のキャプチャに使用されるデバイスやイメージのディメンションなど、画像に関する追加情報を提供する画像ファイル内に埋め込まれたデータです。 イメージ ファイル自体に含まれていますが、このメタデータはレンダリング データの一部ではありません。 WIC には、Extensible Metadata Platform (XMP)、Exchangeable Image File (EXIF)、Png Textual Data (tEXt) など、いくつかの一般的なメタデータ形式に対してこのメタデータの読み取りと書き込みを可能にするインターフェイスが用意されています。

このトピックは、次のセクションで構成されています。

前提条件

このトピックを理解するには、「 Windows イメージング コンポーネントの概要」の説明に従って、WIC エンコーダーおよびデコーダー インターフェイスとそれに関連するコンポーネント オブジェクト モデル (COM) コンポーネントについて理解しておく必要があります。 また、現在使用されている画像メタデータ形式の一部に関する一般的な知識を持つことも役立ちます。

はじめに

メタデータは、イメージに関する拡張情報を提供します。 この情報は、いくつかの方法で使用できます。 画像には、説明、評価、カテゴリ タグ、著作権情報などのメタデータが含まれている場合があります。 メタデータにアクセスすると、資産管理、ファイルの場所、著作権情報の決定などのタスクを簡単に実行できます。 たとえば、Windows Vista の Windows フォト ギャラリーを使用すると、画像に説明とカテゴリ タグを追加できます。 これにより、画像の検出可能性が向上し、画像を分類する便利な方法が可能になります。 WIC API と一般的なメタデータ形式を使用すると、アプリケーションはイメージとの間でこの種類のメタデータを簡単に書き込んだり読み取ったりできます。

次の図は、埋め込みメタデータ ブロックとメタデータ項目を含む JPEG ファイルの内容を示しています。

評価メタデータを含む jpeg 画像

この例の画像では、メタデータがイメージ フレーム内のイメージ ファイルに埋め込まれています。 JPEG 形式では複数のイメージ フレームがサポートされていないため、メタデータはこの単一フレームに概念的にアタッチされます。 TIFF などの複数のフレームをサポートする形式では、この図に示すように、各イメージ フレームにメタデータがアタッチされている場合があります。 現在は一般的ではなく、ネイティブ イメージ コーデックではサポートされていませんが、一部のイメージ形式では、イメージ フレーム外のメタデータもサポートされる場合があります。 WIC は、フレーム レベルのメタデータと、イメージの個々のフレーム外のメタデータの両方を処理するのに十分な柔軟性を備えています。

画像メタデータの読み取り

WIC API は、アプリケーションがイメージ メタデータの読み取りと書き込みを容易にする 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}");
}

メタデータを書き込むもう 1 つの方法は、高速なメタデータ更新です。 高速メタデータ エンコードは、イメージ ファイルを再エンコードしなくても画像メタデータを書き込む方法です。 これは、メタデータ形式の埋め込まれた領域に新しいメタデータ情報を書き込むことで行われます。 高速メタデータ エンコーダー (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 が用意されています。

他のメタデータ形式を完全にサポートするには、メタデータを読み取るメタデータ リーダーとメタデータを書き込むメタデータ ライターという 2 種類のハンドラーを開発する必要があります。 これらの 2 つのハンドラーは、通常、特定の形式のペアで実装されますが、これは要件ではありません。 読み取り機能のみが必要な場合や、書き込み機能のみが必要な場合があります。

WIC API を使用したメタデータ拡張の詳細については、「 メタデータ拡張の概要」を参照してください。

サポートされているメタデータ形式

WIC では、いくつかの一般的なメタデータ形式がサポートされています。 次の表は、サポートされているメタデータ形式、そのバージョン、メタデータ形式をサポートするイメージ形式、およびメタデータ形式が高速メタデータ エンコードをサポートしているかどうかを示しています。 高速メタデータ エンコードの詳細については、このドキュメントの前半の 「イメージ メタデータの書き込み 」セクションを参照してください。

サポートされているメタデータ形式 メタデータ仕様のバージョン イメージ形式のサポート 高速メタデータ エンコードをサポート
App0 JFIF 1.02 JPEG いいえ
App1 JFIF 1.02 JPEG、TIFF いいえ
App13 Unknown JPEG、TIFF いいえ
IFD TIFF 6.0 JPEG、TIFF はい
Irb Unknown JPEG、TIFF いいえ
Exif Exif 2.2 JPEG、TIFF はい
Xmp XMP 1.0 (2005 年 9 月) 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 フレーム エンコード (IWICBitmapFrameEncode)
  • エンコーダーが保持するストリームにエンコードされるフレームを作成します。
  • IWICMetadataBlockWriter インターフェイスを実装して、フレームのデータ ストリームに書き込むメタデータ ブロックの一覧を作成します。
  • クエリ式を使用して、フレームに関連付けられているメタデータを書き込むクエリ ライターを公開します。

 

次の表では、WIC メタデータ コンポーネントについて説明します。 これらのコンポーネントを使用すると、前の表に示したコンポーネントによって公開されているイメージ内のメタデータの読み取りと書き込みを行うことができます。

コンポーネント 説明
メタデータ クエリ リーダー (IWICMetadataQueryReader)
  • クエリ文字列を取得し、基になるメタデータ階層を移動してメタデータを取得します。
メタデータ クエリ ライター (IWICMetadataQueryWriter)
  • クエリ文字列を取得し、基になるメタデータ階層を移動して、メタデータの取得、設定、および削除を行います。
メタデータ ブロック リーダー (IWICMetadataBlockReader)
  • メタデータ階層の上部にある IWICMetadataReader オブジェクトの読み取り専用コレクションを管理し、すべてのメタデータ ブロックの列挙を有効にします。
  • ビットマップ デコーダーとデコードされたビットマップ フレームによって実装されます。
  • カスタム コーデック用のサードパーティコンポーネント開発者によって実装されます。
メタデータ ブロック ライター (IWICMetadataBlockWriter)
  • メタデータ階層の上部にある IWICMetadataWriter オブジェクトの読み取りおよび書き込みコレクションを管理します。
  • ビットマップ エンコーダーとビットマップ フレーム エンコードによって実装されます。
  • カスタム コーデック用のサードパーティコンポーネント開発者によって実装されます。
メタデータ リーダー (IWICMetadataReader)
  • メタデータのストリームを解析し、メタデータ項目の読み取り専用コレクションを管理します。 EXIF、IFD、XMP などのメタデータ形式に関連付けられます。
  • 書式と ID のペアが指定された場合に値を返すディクショナリとして機能します。
  • カスタム メタデータ型用にサードパーティコンポーネント開発者によって実装されます。
メタデータ ライター (IWICMetadataWriter)
  • メタデータのストリームを解析してシリアル化し、メタデータ 項目の読み取り/書き込みコレクションを管理します。
  • カスタム メタデータ型用にサードパーティコンポーネント開発者によって実装されます。
高速メタデータ エンコーダーIWICFastMetadataEncoder
  • イメージを再エンコードせずにメタデータをインプレースで更新するメタデータ階層に書き込むセマンティクスを公開します。

 

概念

Windows Imaging コンポーネントの概要

メタデータ クエリ言語の概要

イメージ メタデータの読み取りと書き込みの概要

メタデータ拡張の概要

方法: メタデータを使用して JPEG イメージを再エンコードする