Windows イメージング コンポーネントのしくみ

検出と仲裁

イメージをデコードするには、そのイメージ形式をデコードできる適切なコーデックが見つかる必要があります。 ほとんどのシステムでは、サポートされているイメージ形式がハードコーディングされているため、検出プロセスは必要ありません。 Windows Imaging Component (WIC) プラットフォームは拡張可能であるため、イメージの形式を識別し、適切なコーデックと一致させる必要があります。

実行時の検出をサポートするには、各イメージ形式に、その形式に適したデコーダーを識別するために使用できる識別パターンが必要です。 (新しいファイル形式の場合は、一意であることが保証されるため、識別パターンに GUID を使用することを強くお勧めします)。識別パターンは、そのイメージ形式に準拠する各イメージ ファイルに埋め込む必要があります。 各デコーダーには、デコードできるイメージ形式の識別パターンまたはパターンを指定するレジストリ エントリがあります。 アプリケーションがイメージを開く必要がある場合は、WIC からデコーダーを要求します。 WIC は、レジストリで使用可能なデコーダーを検索し、各レジストリ エントリで、イメージ ファイルに埋め込まれているパターンと一致する識別パターンを確認します。 デコーダー レジストリ エントリの詳細については、「Encoder 固有のレジストリ エントリ」を参照してください。

WIC は、イメージ内の識別パターンに一致する単一のデコーダーを検出すると、デコーダーのインスタンスを作成し、イメージ ファイルを渡します。 WIC が複数の一致を検出した場合は、一致するデコーダーごとに QueryCapability というメソッドを呼び出して、それらの間でアービトレーションを行い、最適な一致を見つけます。 詳細については、「IWICBitmapDecoder の実装」の QueryCapabilities セクションを参照してください。

デコード

適切なデコーダーを選択してインスタンス化すると、アプリケーションはデコーダーと直接対話します。 デコーダーにはいくつかの役割があり、さまざまなインターフェイスを介して実装されます。 これらのサービスは、次のように分類できます。

  • コンテナー レベルのサービス
  • フレーム レベルのサービス
  • メタデータ列挙サービス
  • ネイティブ デコーダー変換
  • 進行状況の通知と取り消しのサポート
  • 生処理サービス

コンテナー レベルのサービスには、最上位のサムネイル (サポートされている場合)、プレビュー、カラー コンテキスト、パレット (該当する場合)、コンテナー形式の取得、コンテナー内の個々のイメージ フレームへのアクセスの提供が含まれます。 (一部のコンテナーには 1 つのフレームのみが含まれますが、タグ付けされたイメージ ファイル形式 (TIFF) などのコンテナーには複数のフレームを含めることができます)。 この一連のサービスには、デコーダー自体に関する情報と、特定のイメージ ファイルに関するその機能も含まれます。

個々のフレームには独自のサムネイルがあり、フレーム レベルで公開される独自のカラー コンテキスト、パレット、およびその他のプロパティを持つ場合もあります。 ただし、フレーム レベルで実行される最も重要な操作は、そのフレームのイメージ ビットの実際のデコードです。

WIC は、最も一般的なメタデータ形式 (IFD、EXIF、IPTC、XMP、APP0、APP1、およびその他の形式) のメタデータ リーダーを提供し、サードパーティのメタデータ形式の拡張性もサポートします。 これにより、メタデータを解析する責任のコーデックが解放されます。 ただし、コーデックはメタデータ ブロックを列挙し、各ブロックのメタデータ リーダーを要求する役割を担います。 WIC は、メタデータ ハンドラーのレジストリ エントリのパターンに一致するブロック ヘッダーのパターンに基づいて、コーデックの場合と同じようにメタデータ ハンドラーの検出を実行します。 詳細については、エンコーダー固有のレジストリ エントリに関するページを参照してください。

デコーダーは、変換操作をネイティブにサポートする必要はありませんが、これにより、より優れたエンド ユーザー エクスペリエンスを提供する大幅なパフォーマンス最適化が可能になります。 たとえば、アプリケーションは、イメージをレンダリングする前に、イメージに対して実行するさまざまな変換 (スケーリング、トリミング、回転、ピクセル形式変換) のパイプラインを作成できます。 変換パイプラインの詳細については、「 IWICBitmapSource」を参照してください。 変換パイプラインを作成した後、アプリケーションはパイプライン内の最終的な変換を要求して、すべての変換をイメージ ソースに適用した結果として得られるビットマップを生成します。 その時点で、デコーダー自体が変換操作を実行できる場合、WIC は要求された変換のうちどれを実行できるかを確認します。 デコーダーが実行できない要求された変換は、デコードされたイメージで WIC によって実行されてから、呼び出し元に返されます。 この最適化された変換パイプラインは、特にデコード プロセス中に変換の一部またはすべてを実行できる場合に、メモリ内で各変換を順番に実行するよりも優れたパフォーマンスを提供します。

進行状況通知と取り消しのサポートにより、アプリケーションは長い操作の進行状況通知を要求でき、また、アプリケーションは、時間がかかりすぎる操作を取り消す機会をユーザーに提供できます。 ユーザーが操作を取り消すことができない場合、プロセスがハングしたと感じ、アプリケーションを閉じてキャンセルしようとする可能性があるため、これは重要です。

これらのインターフェイスについては、「 WIC 対応デコーダーの実装」のセクションで詳しく説明します。

生処理サービスには、露出、コントラスト、シャープニングなどのカメラ設定の調整や、生ビットを処理する前の色空間の変更などがあります。

Encoding

デコーダーと同様に、エンコーダーにはインターフェイスを介して実装する責任があります。 エンコーダーが提供するサービスは、デコーダーによって提供されるサービスを補完するものですが、読み取るのではなく画像データを書き出す点が除きます。 エンコーダーは、次のカテゴリのサービスも提供します。

  • コンテナー レベルのサービス
  • フレーム レベルのサービス
  • メタデータ列挙と更新サービス
  • 進行状況の通知と取り消しのサポート

エンコーダーのコンテナー レベルのサービスには、最上位のサムネイル (サポートされている場合)、プレビュー、パレット (該当する場合) の設定、およびコンテナーにシリアル化できるように個々のイメージ フレームを反復処理することが含まれます。

エンコーダーのフレーム レベルのサービスミラーデコーダー用のサービスですが、読み取るのではなく、イメージ データ、サムネイル、および関連するパレットやその他のコンポーネントを書き出す点が除きます。

また、エンコーダーのメタデータ列挙サービスには、書き込まれるメタデータ ブロックの反復処理と、メタデータをディスクにシリアル化するための適切なメタデータ ライターの呼び出しが含まれます。

これらのインターフェイスについては、「 WIC 対応エンコーダーの実装」のセクションで詳しく説明します。

コーデックの有効期間

WIC コーデックは 1 つのイメージを処理するためにインスタンス化され、通常は有効期間が短くなります。 イメージが読み込まれるときに作成され、イメージが閉じられると解放されます。 アプリケーションでは、有効期間が重複する多数のコーデックを同時に使用する場合があり (何百ものイメージを含むディレクトリをスクロールすることを考えて)、複数のアプリケーションが同時にこれを実行している可能性があります。

一部のコーデックには、ライブプロセスの有効期間をスコープとする有効期間がありますが、WIC コーデックの場合はこれに該当しません。 Windows Vista フォト ギャラリー、Windows エクスプローラー、フォト ビューアー、およびその他の多数のアプリケーションは WIC 上に構築されており、コーデックを使用して画像やサムネイルを表示します。 コーデックの有効期間がプロセスの有効期間にスコープされている場合、Windows Vista エクスプローラーにイメージまたはサムネイルが表示されるたびに、そのイメージをデコードするためにインスタンス化されたコーデックは、ユーザーが次回コンピューターを再起動するまでメモリ内に残ります。 コーデックがアンロードされない場合、そのリソースは、システム内の他のコンポーネントで使用できないため、実際には "リーク" されます。

コーデックを WIC で有効にする方法

  1. イメージをデコードし、メタデータのブロックを反復処理するために必要な WIC インターフェイスを公開する、コンテナー レベルのデコーダー クラスとフレーム レベルのデコーダー クラスを実装します。 これにより、すべての WIC ベースのアプリケーションは、標準のイメージ形式と対話するのと同じ方法でコーデックを操作できます。
  2. イメージをエンコードし、メタデータのブロックをイメージ ファイルにシリアル化するために必要な WIC インターフェイスを公開する、コンテナー レベルのエンコーダー クラスとフレーム レベルのエンコーダー クラスを実装します。
  3. コンテナー形式が TIFF または JPEG コンテナーに基づいていない場合は、一般的なメタデータ形式 (EXIF、XMP) のメタデータ ハンドラーを記述する必要がある場合があります。 ただし、TIFF ベースまたは JPEG ベースのコンテナー形式を使用する場合は、システム提供のメタデータ ハンドラーに委任できるため、これは必要ありません。
  4. すべてのイメージ ファイルに一意の識別パターン (GUID をお勧めします) を埋め込みます。 これにより、検出中にイメージ形式をコーデックと照合できます。 既存のイメージ形式の WIC ラッパーを作成する場合は、エンコーダーが常にそのイメージ形式に固有のイメージ ファイルに書き込むビットのパターンを見つけ、これを識別パターンとして使用する必要があります)。
  5. インストール時にコーデックを登録します。 これにより、レジストリ内の識別パターンとイメージ ファイルに埋め込まれたパターンを照合することで、実行時にコーデックを検出できます。
  6. Windows 7 の時点で、WIC ではコーデックが COM アパートメント タイプ "両方" である必要があります。 つまり、マルチスレッド シナリオでは、アパートメント間の呼び出し元と呼び出し元を処理するために適切なロックを行う必要があります。 詳細については、マルチスレッド アパートメントのサポートに関する次のセクションを参照してください。
  7. 64 ビット プラットフォームのサポート: Windows 7 の場合、WIC では、サードパーティの WIC コーデックを 32 ビットと 64 ビットの両方のネイティブ バイナリとして配信する必要があります。 さらに、32 ビット 形式は 64 ビット システムにインストールして実行する必要があり、サード パーティの Windows 7 コーデック インストーラーは 64 ビット システムに 32 ビットバイナリと 64 ビット バイナリの両方をインストールする必要があります。

WIC でのマルチスレッド アパートメントサポート

マルチスレッド アパートメント (MTA) 内のオブジェクトは、MTA 内の任意の数のスレッドによって同時に呼び出される場合があります。 これにより、マルチコア システムと特定のサーバー シナリオでのパフォーマンスが向上します。 さらに、MTA の WIC コーデックは、異なる STA アパートメント内のスレッド間の呼び出しに関連するマーシャリング コストなしで、MTA 内の他のオブジェクトを呼び出すことができます。 Windows 7 では、JPEG、TIFF、PNG、GIF、ICO、BMP など、MTA をサポートするために、すべてのインボックス WIC コーデックが更新されています。 MTA をサポートするためにサード パーティ製コーデックを記述することを強くお勧めします。 MTA をサポートしないサードパーティ製コーデックは、マーシャリングのためにマルチスレッド アプリケーションで大幅なパフォーマンス コストを引き起こします。 MTA サポートを有効にするには、サードパーティのコーデックに適切な同期を実装する必要があります。 これらの同期手法の正確な実装は、このペーパーの範囲を超えています。 COM オブジェクトの同期の詳細については、「COM スレッド モデルの概要と使用」を参照してください。

概念

概要 (WIC 対応コーデックを記述する方法)

WIC 対応デコーダーの実装

WIC 対応コーデックを作成する方法

Windows イメージング コンポーネントの概要

WIC メタデータの概要