1

我一直在努力反对这一点,但无济于事。

我有一堆地质样本的图像,它们标称 1500 像素宽 x 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;

现在使用每米“全尺寸”图像的像素(深度以米为单位)我确定我实际想要显示的深度范围(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 而不是仅在子图像上设置它,但这似乎很好,只要我不想相对于彼此调整视口宽度。

我检查了正在解析和传入的深度值,它们是正确的。

4

1 回答 1

0

DeepZoom 的东西,尤其是 Viewports,在我使用它时总是让我头疼。除了向您指出帮助我获得它的方向外,我不确定我能否回答您的问题。

我最近发现的其他资源之一是Eventr ,我认为它比深度缩放工具本身更容易使用。该工具使创建和显示深度缩放集合变得更加容易。

于 2009-12-14T16:45:17.867 回答