クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
Web 開発
Silverlight
ビジュアル デザイン
Deep Zoom

  低帯域幅での表示をオンにする
Silverlight
Deep Zoom

Deep Zoom を使用すると、ほとんどの任意の大きなイメージを、Silverlight で非常に滑らかにズームできます。イメージを表示するアプリケーションのパフォーマンスに影響を与えることなく、非常に小さなスケールおよび非常に大きなスケールでイメージを表示できます。画面に表示されるピクセルの数だけが、パフォーマンスに影響を与える唯一のプロパティです。

Deep Zoom を使用する Web サイトの例を参照するには、ここをクリックしてください。イメージを拡大および縮小するには、マウス ホイールを使用します。イメージを移動するには、ドラッグします。

ここでは、Deep Zoom を使用するシナリオおよび Silverlight アプリケーションでの使用方法を含めて、Deep Zoom の概要を説明します。

このトピックには次のセクションが含まれています。

Deep Zoom を使用する主なシナリオとして、大きなイメージや、イメージのパノラマの表示と移動が考えられます。通常、大きなイメージの読み込みは時間がかかるため、ユーザーにとって快適な動作ではありません。Deep Zoom では、高解像度のイメージを段階的に読み込むことによって、この問題を軽減します。この結果、粗いイメージから鮮明なイメージへと画質が向上します (詳細については、このトピックの「Deep Zoom について」を参照してください)。また、Deep Zoom は、スプリング アニメーションを使用してイメージの表示を変更できるようにする機能を備えています。これにより、イメージの滑らかな "動き" をユーザーに印象付けます。次に例を示します。

  • 非常に大きなイメージまたは高解像度のイメージの操作 : この機能を使用する典型的な例として、大きな地図の一部を拡大してさまざまなレベルの詳細を表示し、マウスを使用して地図上でビューを移動することが挙げられます。ユーザーがビューを移動すると、アニメーションの使用により、イメージ上のある場所から別の場所に自分が移動しているように見えます。別の例としては、高解像度の写真で構成されたプロ仕様の写真構成があります。

  • 3-D 写真 : 連続して部屋の写真を撮影し、部屋の 360°の写真で構成される写真のコレクションを作成します。これにより、ユーザーは、各写真が他の写真とブレンドした状態で部屋をパンできます。

  • 広告 : 比較的低解像度のイメージを作成して、広告の全体的なテーマを表現してから、製品に関するより多くの広告とデータを含む高解像度のイメージを段階的に表示できます。広告が埋め込まれたページが最初に読み込まれるときに、広告は滑らかに鮮明になり、続いて高解像度のイメージを読み込んでユーザーの注意を引きつけます。また、マウスが広告内に移動すると、広告のさまざまな部分が拡大表示されます。

Deep Zoom では、複数解像度のイメージを用意し、スプリング アニメーションを使用することによって、滑らかな読み込みとパンを可能にしています。

読み込み

Deep Zoom では、複数解像度のイメージのさまざまな側面を使用して、非常に大きなイメージであっても、高いフレームレートのまま高速で開くことができます。イメージを開くときに画面に何らかのイメージを表示するために、すばやく読み込むことができる少量のデータのみが必要になります。最初に低解像度バージョンのイメージが拡大表示され、続いて高解像度バージョンが使用できるようになると、高解像度バージョンにブレンドされます。このため、Deep Zoom では、粗いイメージから鮮明なイメージへと画質が明確に向上します。また、イメージのサイズに関係なく、イメージ データを読み込むための待ち時間をそれほどかけずに、イメージがすぐに開くように見せることができます。

Cc645050.Different_res_over_time(ja-jp,VS.95).png

最初の読み込み以外にも、ユーザーがアプリケーションを操作するときに (ズーム、パンなど)、これと同じ動作が得られます。必要に応じたさまざまな解像度のイメージの提供は、イメージ ピラミッドの使用により実現されます。

イメージ ピラミッド

イメージ ピラミッドでは、イメージが JPG イメージまたは PNG イメージの 256 × 256 の小さいタイルに分割され (ここでのサイズは任意であり、変更できます)、低解像度バージョンのイメージも同様にタイルで保存されます。各タイルは個別のファイルに保存され、ピラミッドの各レベルが個別のフォルダに保存されます。次の図は、イメージ ピラミッドの動作を概略的に示しています。イメージそのものは、ピラミッドの最下位で最大解像度で使用でき (次の図を参照)、4 × 4 ピクセルの低解像度バージョンが最大解像度のイメージと共に保存されます。ピラミッドの各レベルのイメージは、256 × 256 ピクセルのタイルで保存されます (イメージでは白色のラインで示されます)。このため、Deep Zoom では、イメージ全体をダウンロードせずに、画面上でイメージの現在のサイズに必要なタイルのみをフェッチできます。たとえば、イメージのハイライトされた中央の領域だけを見るためにズームインすると、Deep Zoom は 1024 × 1024 のイメージ全体ではなく、ハイライトされたタイルのみを読み込みます。

Cc645050.Image_pyramid(ja-jp,VS.95).png

このようなピラミッドを手動で作成するのはたいへんなので、ツールを使用して、イメージをイメージ ピラミッドに変換することをお勧めします。たとえば、Deep Zoom Composer を使用できます。イメージ ピラミッドにアクセスするために使用するファイル形式では、XML スキーマが使用されます。Deep Zoom Composer を使用してもこのファイル形式を生成できますが、手動で XML を作成するか、ツールを使用して生成したファイルを手動で変更して、ファイル形式をより正確に管理することをお勧めします。Deep Zoom ファイル形式で使用される XML スキーマの詳細については、「Deep Zoom ファイル形式の概要」を参照してください。

Cc645050.alert_note(ja-jp,VS.95).gifメモ :

Deep Zoom イメージ ピラミッドは、BitmapImage クラスによってサポートされているイメージ ファイルのみをサポートします。

Cc645050.alert_note(ja-jp,VS.95).gifメモ :

Photosynth は、Deep Zoom Composer と同じ形式を使用したツールであり、Deep Zoom アプリケーションにも適しています。Photosynth は、3D の 360° モデルを制作するためのツールとして設計されました。たとえば、旅行先で訪れた建物を一連のデジタル写真として撮影し、そのイメージを Photosynth に読み込むと、Photosynth が各写真の類似点を解析して、それを基に撮影場所のモデルを構築します (それぞれの写真がつなぎ合わされます)。

パンおよびズームのアニメーション

Deep Zoom 内のすべての動作 (パンまたはズーム) では、スプリング アニメーションが使用されます。これらのスプリングは、初期状態から最終状態までアニメーション化され、時間を基準としたグラデーションは、1 に向かって指数関数的に減衰します。スプリングの終了値は、ユーザーによるズームおよびパン操作に対応してすぐに更新されます。開発者によって表示ビューポートが変更されると、スプリングを使用して滑らかさと視覚的な連続性を確認し、コンテンツを新しいビューポートに適合させる遷移が発生します。

このセクションでは、非常に単純な Deep Zoom アプリケーションの作成方法について説明します。その手順は次のとおりです。

1. イメージ ピラミッドを作成します。

2. MultiScaleImageMultiScaleSubImage などの Deep Zoom オブジェクトをアプリケーションに追加します。

3. イベントをフックして、対話機能 (ズームおよびパン) を Deep Zoom オブジェクトに追加します。

イメージ ピラミッドの作成

上記のように、イメージ ピラミッドを作成するには、Deep Zoom Composer などのツールを使用することをお勧めします。このツールを使用すると、パノラマに配置された単一のイメージまたは複数のイメージからイメージ ピラミッドを作成できます。

Deep Zoom オブジェクトの追加

Deep Zoom ピラミッド (単に Deep Zoom イメージとも呼ばれます) を作成すると、これを読み込むための MultiScaleImage などの Deep Zoom オブジェクトが必要になります。次の例のように、MultiScaleImage は XAML で作成できます。

XAML
<MultiScaleImage x:Name="deepZoomObject" Source="source/items.dzi" />

次の例のように、MultiScaleImage を手続き的コードで作成することもできます。

C#
MultiScaleImage myDeepZoomObject = new MultiScaleImage();
myDeepZoomObject.Source = new Uri("source/items.dzi");

Source プロパティでは、最初の手順で作成した Deep Zoom イメージが参照される点に注意してください。この時点で Web ページが開くと、イメージは、粗い解像度から鮮明な解像度に画質が変化しながら画面全体に表示されます。

イベントのフック

この時点ではまだ、ユーザーはイメージを操作できません。操作を有効にするには、イベントを MultiScaleImage にフックし、手順コードを使用して、ズームおよびパン機能を使用できるようにします。

この単純な例では、MouseEnter イベントは、マウス ポインタをイメージ上に移動したときに、そこを中心に拡大するために使用されます。

XAML
<MultiScaleImage x:Name="deepZoomObject" Source="source/items.bin" 
MouseEnter="DeepZoomObject_MouseEnter" />
C#
private void DeepZoomObject_MouseEnter(object sender, MouseEventArgs e)
{
    // The ZoomAboutLogicalPoint method allows you to zoom and pan
    // in the same step. The first parameter is the zoom (3x) and the
    // third and fourth parameters are the respective x and y coordinates
    // of the logical point to zoom around.
    this.deepZoomObject.ZoomAboutLogicalPoint(3, .5, .5);
}

このサンプルを実行する

前の例では、ZoomAboutLogicalPoint メソッドによりズームおよびパンが実行されます。最初のパラメータは、現在のイメージの倍率からインクリメントされる拡大率です。たとえば、この例では、既定のズームは 1 であり、値が 3 の場合は 3 倍に拡大されることを意味します。同じ値を使用して再度拡大する場合、3 * 3 の倍率で拡大されます。これは、最初のサイズの 9 倍になります。

ZoomAboutLogicalPoint メソッドの 2 番目と 3 番目のパラメータはそれぞれ、ズーム (パン) 時の論理点の x 座標および y 座標です。論理点は、イメージ内の x 位置および y 位置について正規化した値 (0 ~ 1) を使用します。したがって、値 0.5, 0.5 はイメージの中央になります。これは、0.5 が 0 と 1 の中間の値であるためです。座標値 <= 0 または >=1 を指定すると、イメージは完全にビューの外側にパンされます。

ある時点でユーザーが表示するイメージの領域は、ビューポート領域と呼ばれます。ビューポート領域の概念を次の図に示します。

Cc645050.DeepZoom_ViewPort(ja-jp,VS.95).png

以下は、単純な "マウス オーバー/マウス オフ" ズームの完全なコードです。このコードには MouseLeave イベントが含まれているため、マウス ポインタがイメージから離れると、そのイメージは元の視点に再びズーム アウトおよびパンされます。

XAML
<MultiScaleImage x:Name="deepZoomObject" Source="source/items.bin" 
  MouseEnter="DeepZoomObject_MouseEnter"
  MouseLeave="DeepZoomObject_MouseLeave"/>
C#
private void DeepZoomObject_MouseEnter(object sender, MouseEventArgs e)
{
    // If animation springs were turned off, then 
    // turn them back on
    if (deepZoomObject.UseSprings == false)
    {
        deepZoomObject.UseSprings = true;
    }

    // The ZoomAboutLogicalPoint method allows you to zoom and pan
    // in the same step. The first parameter is the zoom (3x) and the
    // third and fourth parameters are the respective x and y coordinates
    // of the logical point to zoom around.
    this.deepZoomObject.ZoomAboutLogicalPoint(3, .5, .5);
}

private void DeepZoomObject_MouseLeave(object sender, MouseEventArgs e)
{
    double zoom = 1;
    zoom = zoom / 3;
    // This time the zoom is reversed (1/3) although the pan 
    // remains the same - zoom back out from the middle.
    this.deepZoomObject.ZoomAboutLogicalPoint(zoom, .5, .5);
}

このサンプルを実行する

マウスをドラッグすることによるパンや、マウス ホイールやクリックによるズームなど、基本的な機能を紹介した単純なサンプルについては、次のリンクを使用してください。

個々のイメージのセットを操作する場合、たとえば、プログラムによって個々のイメージを画面内で移動したり、イメージをフィルタ処理したりする場合、単一の高解像度イメージではなく、イメージのコレクションを使用します。そのためには、基本的に次の 2 つを実行する必要があります。

  1. 単一のイメージではなくコレクションとしてイメージをエクスポートします。これを実行するには、Deep Zoom Composer を使用します。コンポジションのエクスポート時にコレクションを作成するチェック ボックスをオンにしてください。エクスポートするコレクション内のイメージは "サブイメージ" と呼ばれます。

  2. SubImages プロパティを使用して、MultiScaleImage 内のサブイメージ (個々の MultiScaleSubImage オブジェクト) にアクセスします。MultiScaleSubImage 内のサブイメージの一覧を取得する方法を次の例に示します。

    C#
    private List<MultiScaleSubImage> RandomizedListOfImages()
    {
      List<MultiScaleSubImage> imageList = new List<MultiScaleSubImage>();
      Random ranNum = new Random();
    
      // Store List of sub images.
      foreach (MultiScaleSubImage subImage in myMultiScaleImage.SubImages)
      {
        imageList.Add(subImage);
      }
    
      return imageList;
    }
    

次のサンプルでは、コレクション内のすべての MultiScaleSubImage オブジェクトを操作してイメージをグリッド パターンに再配置する例を紹介しています。効果を確認するには、イメージをランダム化するボタンをクリックします。

コミュニティ コンテンツ   コミュニティ コンテンツとは
新しいコンテンツの追加 RSS  注釈
Processing
© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker