Через некоторое время я вижу, что проблема была в функции вычисления масштаба.
private Point scaleCalculation(Point real, Size pBox, Size imCalc) {
double scale, spare;
try {
if (imCalc.Height > imCalc.Width){
scale = (double)imCalc.Height / pBox.Height;
spare = (pBox.Width - (imCalc.Width / scale)) / 2;
var x = (real.X - spare);
x = (x < 0) ? 0 : x;
return new Point((int)(x * scale), (int)(real.Y * scale));
}
else {
scale = (double)imCalc.Width / pBox.Width;
spare = (pBox.Height - (imCalc.Height/scale))/2;
var y = (real.Y - spare);
y = (y < 0) ? 0 : y;
return new Point((int)(real.X * scale),(int) (y *scale));
}
}
catch (Exception ex) {
return new Point();
}
}
Я попытаюсь объяснить это здесь с помощью рисунка.
(Xr, Yr): координата, которую мы хотим знать.(Xm, Ym): координата мыши.(Wi, Hi): размер картинки.(Wp, Hp): размер поля изображения.S: пространство от края поля Imagebox до изображения.
Xr = (Xm * scale)
S = [Hp -(Hi/scale)]/2
Yr = (Ym-S)
(это объяснение, когда ширина больше высоты)
Первое, что я делаю, это вычисляю масштаб, используя ширину илизависит от высоты, которая больше.
Чтобы вычислить S (запасную), высота изображения должна масштабироваться до высоты Imagebox, вычесть его из высоты Imagebox и разделить на 2, чтобы результат имел значениетолько одного размера.
Из Ym (Real.Y) вычитается запасная часть для вычисления y.и проверьте, является ли результат отрицательным.
Наконец, результат - Xm и y, умноженные для масштаба соответственно