Логический вопрос о расположении точки обзора Silverlight MultiScaleImage / SubImage - PullRequest
1 голос
/ 14 декабря 2009

Я долго бился с этим, но безрезультатно.

У меня есть набор изображений геологических образцов, которые номинально имеют ширину 1500 пикселей и длину 30000 пикселей. Типичный набор этих изображений будет от 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 голосов
/ 14 декабря 2009

Материал DeepZoom, особенно Viewports, всегда заставляет мою голову болеть, когда я с ней работаю. Я не уверен, что могу ответить на ваш вопрос, кроме как указать вам, что помогло мне его получить.

Один из других ресурсов, которые я недавно обнаружил, с которыми, по-моему, работать намного проще, чем сами инструменты глубокого увеличения, - Eventr . Этот инструмент значительно упрощает создание и отображение коллекций с глубоким увеличением.

...