Логический вопрос о расположении точки обзора Silverlight MultiScaleImage/SubImage
Я бился головой об этом какое-то время безрезультатно.
У меня есть несколько изображений геологических образцов, которые номинально имеют ширину 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;
Теперь, используя пиксели "полноразмерного" изображения на метр (глубины указаны в метрах), я определяю, какой диапазон глубины я действительно хочу отобразить (ось у масштабируется по глубине):
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 ответ
Материал DeepZoom, и особенно Viewports, всегда заставляет мою голову болеть, когда я с ней работаю. Я не уверен, что смогу ответить на ваш вопрос, кроме как указать вам, что помогло мне его получить.
Еще один ресурс, который я недавно обнаружил и с которым, мне кажется, работать намного проще, чем сами инструменты глубокого увеличения, - это Eventr. Этот инструмент значительно упрощает создание и отображение коллекций с глубоким увеличением.