状态栏右下角显示图像像素坐标和灰度
This commit is contained in:
@@ -41,6 +41,7 @@
|
|||||||
MouseLeftButtonDown="Canvas_MouseLeftButtonDown"
|
MouseLeftButtonDown="Canvas_MouseLeftButtonDown"
|
||||||
MouseLeftButtonUp="Canvas_MouseLeftButtonUp"
|
MouseLeftButtonUp="Canvas_MouseLeftButtonUp"
|
||||||
MouseMove="Canvas_MouseMove"
|
MouseMove="Canvas_MouseMove"
|
||||||
|
MouseLeave="Canvas_MouseLeave"
|
||||||
MouseRightButtonDown="Canvas_MouseRightButtonDown"
|
MouseRightButtonDown="Canvas_MouseRightButtonDown"
|
||||||
PreviewMouseRightButtonUp="Canvas_PreviewMouseRightButtonUp">
|
PreviewMouseRightButtonUp="Canvas_PreviewMouseRightButtonUp">
|
||||||
|
|
||||||
|
|||||||
@@ -299,6 +299,19 @@ namespace XP.ImageProcessing.RoiControl.Controls
|
|||||||
set => SetValue(ShowCrosshairProperty, value);
|
set => SetValue(ShowCrosshairProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── 光标信息(像素坐标 + 灰度值)──
|
||||||
|
|
||||||
|
public static readonly DependencyProperty CursorInfoProperty =
|
||||||
|
DependencyProperty.Register(nameof(CursorInfo), typeof(string), typeof(PolygonRoiCanvas),
|
||||||
|
new PropertyMetadata("X: -- Y: -- Gray: --"));
|
||||||
|
|
||||||
|
/// <summary>鼠标在图像上的像素坐标和灰度值,格式: "X: 123 Y: 456 Gray: 128"</summary>
|
||||||
|
public string CursorInfo
|
||||||
|
{
|
||||||
|
get => (string)GetValue(CursorInfoProperty);
|
||||||
|
set => SetValue(CursorInfoProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
private Line _crosshairH, _crosshairV;
|
private Line _crosshairH, _crosshairV;
|
||||||
|
|
||||||
private static void OnShowCrosshairChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
private static void OnShowCrosshairChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||||
@@ -1739,6 +1752,38 @@ namespace XP.ImageProcessing.RoiControl.Controls
|
|||||||
|
|
||||||
#region Mouse Events
|
#region Mouse Events
|
||||||
|
|
||||||
|
private void UpdateCursorInfo(Point pos)
|
||||||
|
{
|
||||||
|
if (ImageSource == null)
|
||||||
|
{
|
||||||
|
CursorInfo = "X: -- Y: -- Gray: --";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int px = (int)pos.X, py = (int)pos.Y;
|
||||||
|
string grayText = "--";
|
||||||
|
|
||||||
|
if (ImageSource is BitmapSource bmp && px >= 0 && py >= 0 && px < bmp.PixelWidth && py < bmp.PixelHeight)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pixel = new byte[4];
|
||||||
|
var converted = new FormatConvertedBitmap(bmp, PixelFormats.Bgra32, null, 0);
|
||||||
|
converted.CopyPixels(new System.Windows.Int32Rect(px, py, 1, 1), pixel, 4, 0);
|
||||||
|
int gray = (int)(pixel[2] * 0.299 + pixel[1] * 0.587 + pixel[0] * 0.114);
|
||||||
|
grayText = gray.ToString();
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
CursorInfo = $"X: {px} Y: {py} Gray: {grayText}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Canvas_MouseLeave(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
CursorInfo = "X: -- Y: -- Gray: --";
|
||||||
|
}
|
||||||
|
|
||||||
private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
|
private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
|
||||||
{
|
{
|
||||||
double oldZoom = ZoomScale;
|
double oldZoom = ZoomScale;
|
||||||
@@ -1881,6 +1926,9 @@ namespace XP.ImageProcessing.RoiControl.Controls
|
|||||||
lastMousePosition = currentPosition;
|
lastMousePosition = currentPosition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新光标信息(像素坐标 + 灰度值)
|
||||||
|
UpdateCursorInfo(e.GetPosition(mainCanvas));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||||
|
|||||||
@@ -265,6 +265,13 @@ namespace XplorePlane.ViewModels
|
|||||||
public string CncStatusMessage => _cncEditorViewModel.StatusMessage;
|
public string CncStatusMessage => _cncEditorViewModel.StatusMessage;
|
||||||
public bool CncHasExecutionError => _cncEditorViewModel.HasExecutionError;
|
public bool CncHasExecutionError => _cncEditorViewModel.HasExecutionError;
|
||||||
|
|
||||||
|
private string _cursorInfoText = "X: -- Y: -- Gray: --";
|
||||||
|
public string CursorInfoText
|
||||||
|
{
|
||||||
|
get => _cursorInfoText;
|
||||||
|
set => SetProperty(ref _cursorInfoText, value);
|
||||||
|
}
|
||||||
|
|
||||||
private void ShowWindow(Window window, string name)
|
private void ShowWindow(Window window, string name)
|
||||||
{
|
{
|
||||||
window.Owner = Application.Current.MainWindow;
|
window.Owner = Application.Current.MainWindow;
|
||||||
|
|||||||
@@ -580,7 +580,7 @@
|
|||||||
FontFamily="Consolas"
|
FontFamily="Consolas"
|
||||||
FontSize="11"
|
FontSize="11"
|
||||||
Foreground="White"
|
Foreground="White"
|
||||||
Text="x: 0 y: 0" />
|
Text="{Binding CursorInfoText}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -17,13 +17,19 @@ namespace XplorePlane.Views
|
|||||||
{
|
{
|
||||||
private MainViewModel _mainVm;
|
private MainViewModel _mainVm;
|
||||||
|
|
||||||
private void SetStatus(string msg)
|
private MainViewModel GetMainVm()
|
||||||
{
|
{
|
||||||
if (_mainVm == null)
|
if (_mainVm == null)
|
||||||
{
|
{
|
||||||
try { _mainVm = ContainerLocator.Current?.Resolve<MainViewModel>(); } catch { }
|
try { _mainVm = ContainerLocator.Current?.Resolve<MainViewModel>(); } catch { }
|
||||||
}
|
}
|
||||||
if (_mainVm != null) _mainVm.StatusMessage = msg;
|
return _mainVm;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetStatus(string msg)
|
||||||
|
{
|
||||||
|
var vm = GetMainVm();
|
||||||
|
if (vm != null) vm.StatusMessage = msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ViewportPanelView()
|
public ViewportPanelView()
|
||||||
@@ -113,6 +119,15 @@ namespace XplorePlane.Views
|
|||||||
}, Prism.Events.ThreadOption.UIThread);
|
}, Prism.Events.ThreadOption.UIThread);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
|
// 光标信息:从 RoiCanvas.CursorInfo 同步到 MainViewModel
|
||||||
|
var cursorInfoDesc = System.ComponentModel.DependencyPropertyDescriptor.FromProperty(
|
||||||
|
PolygonRoiCanvas.CursorInfoProperty, typeof(PolygonRoiCanvas));
|
||||||
|
cursorInfoDesc?.AddValueChanged(RoiCanvas, (s, e) =>
|
||||||
|
{
|
||||||
|
var vm = GetMainVm();
|
||||||
|
if (vm != null) vm.CursorInfoText = RoiCanvas.CursorInfo;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
|
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
|
||||||
|
|||||||
Reference in New Issue
Block a user