From 1035f7ef92a9c9c409d35560d9e72ab9dbd706fd Mon Sep 17 00:00:00 2001 From: tayasui rainnya! <156585442+Tayasui-rainnya@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:19:47 +0800 Subject: [PATCH] fix: render ink overlay from strokes to remove capture offset --- Ink Canvas/MainWindow_cs/MW_ImageInsert.cs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs b/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs index 331e9f2e..d07f0abe 100644 --- a/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs +++ b/Ink Canvas/MainWindow_cs/MW_ImageInsert.cs @@ -359,21 +359,21 @@ namespace Ink_Canvas // PointToScreen 返回WPF坐标(DIP),统一转换为设备像素后再与 VirtualScreen 对齐 var inkTopLeftDip = inkCanvas.PointToScreen(new Point(0, 0)); var inkTopLeftPx = transformToDevice.Transform(inkTopLeftDip); - - var inkRectPx = new Rect( - Math.Round(inkTopLeftPx.X - virtualScreen.Left), - Math.Round(inkTopLeftPx.Y - virtualScreen.Top), - Math.Round(inkCanvas.ActualWidth * transformToDevice.M11), - Math.Round(inkCanvas.ActualHeight * transformToDevice.M22)); + var offsetX = inkTopLeftPx.X - virtualScreen.Left; + var offsetY = inkTopLeftPx.Y - virtualScreen.Top; + var strokes = inkCanvas.Strokes.Clone(); var drawingVisual = new DrawingVisual(); using (var dc = drawingVisual.RenderOpen()) { - var visualBrush = new VisualBrush(inkCanvas) - { - Stretch = Stretch.Fill - }; - dc.DrawRectangle(visualBrush, null, inkRectPx); + // 直接绘制墨迹,避免 VisualBrush 在不同 DPI/布局下产生轻微偏移 + var matrix = new Matrix( + transformToDevice.M11, 0, + 0, transformToDevice.M22, + offsetX, offsetY); + dc.PushTransform(new MatrixTransform(matrix)); + strokes.Draw(dc); + dc.Pop(); } var rtb = new RenderTargetBitmap(