在 WPF 图像上绘制矩形以生成它的 CroppedBitmap - 倾斜结果 (C#)

问题描述 投票:0回答:1

我正在开发一个应用程序功能,用户可以通过在其上绘制矩形来选择我显示的图像的一部分,

图像控制中的矩形选择

然后图像的裁剪部分会在窗口中的另一个图像控件中弹出。我有一个“鼠标按下”、“鼠标移动”和“鼠标向上”事件来收集该矩形的起始坐标、宽度和高度,并已成功获得要显示的裁剪选区,但当您从图像顶部选择某些内容,当您靠近底部时,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; 

感谢任何愿意提供帮助的人!

c# wpf bitmapimage
1个回答
0
投票

Canvas 元素上有 Margin 或 Padding 吗?我在移动 MousePoint.X 或 MousePoint.Y 时遇到了问题。

(如果可以的话我会发表评论)

© www.soinside.com 2019 - 2024. All rights reserved.