我正在开发一个应用程序功能,用户可以通过在其上绘制矩形来选择我显示的图像的一部分,
然后图像的裁剪部分会在窗口中的另一个图像控件中弹出。我有一个“鼠标按下”、“鼠标移动”和“鼠标向上”事件来收集该矩形的起始坐标、宽度和高度,并已成功获得要显示的裁剪选区,但当您从图像顶部选择某些内容,当您靠近底部时,X 和 Y 的倾斜变得越来越明显。
就目前而言,我有一个图像控件(ImageViewer1)和一个画布(Canvas1),位于绘制蓝色矩形的顶部。画布适合图像控件 (ImageViewer1.Source) 中显示的文档的大小,因此绘制的所有坐标都应完全匹配。
首先,我在 MouseDown 事件中收集了鼠标的第一个坐标:
var mouseDownPosition = Mouse.GetPosition(Canvas1);
mouseDownPoint = new System.Windows.Point(mouseDownPosition.X, mouseDownPosition.Y);
//^^ I know this was unnecessary, but it's there now lol
继续在我的 MouseMove 事件中绘制矩形(没有问题), 然后在我的MouseUp事件中收集了鼠标的最终坐标:
var mouseUpPosition = Mouse.GetPosition(Canvas1);
mouseUpPoint = new System.Windows.Point(mouseUpPosition.X, mouseUpPosition.Y);
int rectX = Convert.ToInt32((Math.Min(mouseDownPoint.X, mouseUpPoint.X)));
int rectY = Convert.ToInt32((Math.Min(mouseDownPoint.Y, mouseUpPoint.Y)));
int rectWidth = Convert.ToInt32((Math.Abs(mouseUpPoint.X - mouseDownPoint.X)));
int rectHeight = Convert.ToInt32((Math.Abs(mouseUpPoint.Y - mouseDownPoint.Y)));
int sourceToActualXRatio = Convert.ToInt32(imageWidth / ImageViewer1.Source.Width);
int sourceToActualYRatio = Convert.ToInt32(imageHeight / ImageViewer1.Source.Height);
rectX *= sourceToActualXRatio;
rectY *= sourceToActualYRatio;
rectWidth *= sourceToActualXRatio;
rectHeight *= sourceToActualYRatio;
imageWidth 和 imageHeight 包含实际全尺寸图像的测量值,我根据它们创建了比率(sourceToActualXRatio、sourceToActualYRatio)来乘以我的矩形测量值,以便我可以放大它并获得正确的选择。
我认为这是有效的,因为 CroppedBitmap 中的尺寸似乎是正确的,但 X 和 Y 轴的位置是非常不可预测的,所以我认为我缺少如何缩放 rectX 和 rectY 变量的逻辑。
最后,我使用这些矩形尺寸创建 CroppedBitmap:
BitmapSource bms = (BitmapSource)ImageViewer1.Source;
CroppedBitmap cropped_bitmap = new CroppedBitmap(bms, new Int32Rect(rectX, rectY, rectWidth, rectHeight));
ImageViewer2.Source = cropped_bitmap;
感谢任何愿意提供帮助的人!
Canvas 元素上有 Margin 或 Padding 吗?我在移动 MousePoint.X 或 MousePoint.Y 时遇到了问题。
(如果可以的话我会发表评论)