私はしばらくの間、これに対して頭を悩ませてきましたが、役に立ちませんでした。
名目上幅 1500 ピクセル、長さ 30,000 ピクセルの地質サンプルの画像がたくさんあります。これらの画像の典型的なセットは、20 ~ 100 の番号になります。DeepZoomTools.dll を使用してこれらの画像のコレクションを作成し、それを使用して画像をレイアウトしようとしています。
すべての画像は、最初に ViewPort.Origin 0 および ViewPort.Width 1 (基本的にデフォルト) でロードされます。MultiScaleImage.ImageOpenSucceeded イベントの後にそれらを繰り返し処理し、いくつかの追加のメタデータに基づいてそれらを配置しようとしています。
各画像には深度 (メートル単位の深度) が関連付けられており、その深度に基づいて各画像をスタックしたいと考えています。(画像間にギャップが生じる場合があるため、上部の深度値に基づいて各画像を特定する必要があります)。(別の説明についてはコメントを参照してください)。
一連の画像を読み込んだ後、次のように画像自体のメートルあたりのピクセル数を見つけます: (必ずしも連続しているとは限らないため、すべてを合計する必要があります)
double sumImagePixelHeights = (from s in _imageData.Values select s.Height).Sum();
double sumImageDepthRanges = (from s in _imageData.Values select (s.BottomDepth - s.TopDepth)).Sum();
_actualPixelsPerMeter = sumImagePixelHeights / sumImageDepthRanges;
ここで、1 メートルあたりの「フル サイズ」画像のピクセル (深さはメートル単位) を使用して、実際に表示する深さの範囲を決定します (y 軸は深さでスケーリングされます)。
double desiredVisiblePixels = (_MaxVisibleY - _MinVisibleY)*_actualPixelsPerMeter;
mainImage.ViewportWidth = desiredVisiblePixels / mainImage.ActualHeight;
これにより、縦横比のロックにより表示される X 範囲がスケーリングされ、深度範囲に必要な「元の画像ピクセル」の数が表示されるように、ビューポートの幅が設定されます。
次に、mainImage.SubImages コレクション内の画像を反復処理して、目的の深度に基づいて原点を設定します。
for (int index = 0; index < mainImage.SubImages.Count; index++)
{
MultiScaleSubImage si = mainImage.SubImages[index];
ImageMetadata im = _imageData[index];
double xpnt = _actualPixelsPerMeter *im.TopDepth / (im.Width);
si.ViewportOrigin = new Point(0, -xpnt);
}
問題は次
のとおりです。ViewportWidth の計算が正しくありません。画像が本来の 3 倍にスケーリングされています (つまり、10m の「表示される深度範囲」は、3m の実際の深度範囲を表示します)。
私は明らかに私の計算でいくつかの論理が間違っていますが、それを調べた後、私はそれを見ていません.
サブイメージだけに設定するのではなく、マルチスケール イメージ全体に ViewportWidth を設定していますが、ビューポートの幅を互いに相対的に調整したくない限り、それで問題ないようです。
解析されて渡された深度値を確認しましたが、それらは正しいです。