从鼠标光标在屏幕上的位置获取图像坐标(WPF 图像控件)
Get image coordinates from mouse cursor position on screen (WPF Image control)
我一直在寻找一种解决方案来透明地向 WPF 图像控件添加平移和缩放功能,我找到了解决方案 , developed by Wiesław Šoltés and Konrad Viltersten,它非常出色。
现在我想给控件添加一个'mouse click'事件,这样我就可以在原始图像坐标系中得到点击点的坐标,这样我就可以用它们来检索像素颜色。
我知道会有一些舍入,如果图像被缩小,颜色将与屏幕上显示的实际颜色不一致。我也明白用户可能会在图像边界外点击,在这种情况下我希望返回一个空点或负坐标。
我不是 C# 转换方式的专家,目前我对此感到困惑(将添加到 ZoomBorder.cs class 中):
public Point GetImageCoordsAt(MouseButtonEventArgs e)
{
if (child != null)
{
var tt = GetTranslateTransform(child);
var mousePos = e.GetPosition(this);
var transformOrigin = new Point(tt.X, tt.Y);
return mousePos; // Wrong: how do I transform this?
}
return null;
}
正如 mm8 所建议的那样,您可以使用 e.GetPosition(child);
获取您想要的位置
,无需执行任何转换。出于测试目的,我已经覆盖了重置行为。使用 the link you provided 中的代码,更改
void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
this.Reset();
}
到
public Point GetImageCoordsAt(MouseButtonEventArgs e)
{
if (child != null && child.IsMouseOver)
{
return e.GetPosition(child);
}
return new Point(-1, -1);
}
void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show(GetImageCoordsAt(e).ToString());
}
如果您在图像中的相同位置右击,您将获得(大致)相同的坐标,无论平移和缩放如何。
为了将来参考,我试图实现的是:
public Point GetImageCoordsAt(MouseButtonEventArgs e)
{
if (child != null && child.IsMouseOver)
{
var controlSpacePosition = e.GetPosition(child);
var imageControl = this.Child as Image;
var mainViewModel = ((MainViewModel)base.DataContext);
if (imageControl != null && imageControl.Source != null)
{
// Convert from control space to image space
var x = Math.Floor(controlSpacePosition.X * imageControl.Source.Width / imageControl.ActualWidth);
var y = Math.Floor(controlSpacePosition.Y * imageControl.Source.Height / imageControl.ActualHeight);
return new Point(x, y);
}
}
return new Point(-1, -1);
}
其中returns鼠标指针在原图像系统中的坐标
我一直在寻找一种解决方案来透明地向 WPF 图像控件添加平移和缩放功能,我找到了解决方案 , developed by Wiesław Šoltés and Konrad Viltersten,它非常出色。
现在我想给控件添加一个'mouse click'事件,这样我就可以在原始图像坐标系中得到点击点的坐标,这样我就可以用它们来检索像素颜色。
我知道会有一些舍入,如果图像被缩小,颜色将与屏幕上显示的实际颜色不一致。我也明白用户可能会在图像边界外点击,在这种情况下我希望返回一个空点或负坐标。
我不是 C# 转换方式的专家,目前我对此感到困惑(将添加到 ZoomBorder.cs class 中):
public Point GetImageCoordsAt(MouseButtonEventArgs e)
{
if (child != null)
{
var tt = GetTranslateTransform(child);
var mousePos = e.GetPosition(this);
var transformOrigin = new Point(tt.X, tt.Y);
return mousePos; // Wrong: how do I transform this?
}
return null;
}
正如 mm8 所建议的那样,您可以使用 e.GetPosition(child);
获取您想要的位置
,无需执行任何转换。出于测试目的,我已经覆盖了重置行为。使用 the link you provided 中的代码,更改
void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
this.Reset();
}
到
public Point GetImageCoordsAt(MouseButtonEventArgs e)
{
if (child != null && child.IsMouseOver)
{
return e.GetPosition(child);
}
return new Point(-1, -1);
}
void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show(GetImageCoordsAt(e).ToString());
}
如果您在图像中的相同位置右击,您将获得(大致)相同的坐标,无论平移和缩放如何。
为了将来参考,我试图实现的是:
public Point GetImageCoordsAt(MouseButtonEventArgs e)
{
if (child != null && child.IsMouseOver)
{
var controlSpacePosition = e.GetPosition(child);
var imageControl = this.Child as Image;
var mainViewModel = ((MainViewModel)base.DataContext);
if (imageControl != null && imageControl.Source != null)
{
// Convert from control space to image space
var x = Math.Floor(controlSpacePosition.X * imageControl.Source.Width / imageControl.ActualWidth);
var y = Math.Floor(controlSpacePosition.Y * imageControl.Source.Height / imageControl.ActualHeight);
return new Point(x, y);
}
}
return new Point(-1, -1);
}
其中returns鼠标指针在原图像系统中的坐标