fix: render ink overlay from strokes to remove capture offset

This commit is contained in:
tayasui rainnya!
2026-04-09 13:19:47 +08:00
parent 6e4f8bc982
commit 1035f7ef92
+11 -11
View File
@@ -359,21 +359,21 @@ namespace Ink_Canvas
// PointToScreen 返回WPF坐标(DIP),统一转换为设备像素后再与 VirtualScreen 对齐 // PointToScreen 返回WPF坐标(DIP),统一转换为设备像素后再与 VirtualScreen 对齐
var inkTopLeftDip = inkCanvas.PointToScreen(new Point(0, 0)); var inkTopLeftDip = inkCanvas.PointToScreen(new Point(0, 0));
var inkTopLeftPx = transformToDevice.Transform(inkTopLeftDip); var inkTopLeftPx = transformToDevice.Transform(inkTopLeftDip);
var offsetX = inkTopLeftPx.X - virtualScreen.Left;
var inkRectPx = new Rect( var offsetY = inkTopLeftPx.Y - virtualScreen.Top;
Math.Round(inkTopLeftPx.X - virtualScreen.Left), var strokes = inkCanvas.Strokes.Clone();
Math.Round(inkTopLeftPx.Y - virtualScreen.Top),
Math.Round(inkCanvas.ActualWidth * transformToDevice.M11),
Math.Round(inkCanvas.ActualHeight * transformToDevice.M22));
var drawingVisual = new DrawingVisual(); var drawingVisual = new DrawingVisual();
using (var dc = drawingVisual.RenderOpen()) using (var dc = drawingVisual.RenderOpen())
{ {
var visualBrush = new VisualBrush(inkCanvas) // 直接绘制墨迹,避免 VisualBrush 在不同 DPI/布局下产生轻微偏移
{ var matrix = new Matrix(
Stretch = Stretch.Fill transformToDevice.M11, 0,
}; 0, transformToDevice.M22,
dc.DrawRectangle(visualBrush, null, inkRectPx); offsetX, offsetY);
dc.PushTransform(new MatrixTransform(matrix));
strokes.Draw(dc);
dc.Pop();
} }
var rtb = new RenderTargetBitmap( var rtb = new RenderTargetBitmap(