Silverlight MultiScaleImage / SubImage视点排列逻辑问题

时间:2009-12-14 16:27:33

标签: c# silverlight deepzoom multiscaleimage

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

我有一堆地质样本的图像,标称宽度为1500px,长度为30,000px。这些图像的典型集合将从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倍(即10米的“显示深度范围”显示实际深度范围为3米)

在我的计算中,我显然有一些逻辑上的错误,但在重复之后,我只是没有看到它。

我在整个多尺度图像上设置ViewportWidth而不是仅在子图像上设置它,但只要我不想相对于彼此调整视口宽度,这似乎没问题。

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

1 个答案:

答案 0 :(得分:0)

DeepZoom的东西,特别是Viewports,在我使用它时总会让我头疼。我不确定我能回答你的问题,只是指出你的方向是什么帮助我得到它。

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