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