fix: correct ink overlay alignment in screenshot capture

This commit is contained in:
tayasui rainnya!
2026-04-09 13:16:43 +08:00
parent 36e47cec43
commit 6e4f8bc982
+14 -13
View File
@@ -353,16 +353,18 @@ namespace Ink_Canvas
} }
var virtualScreen = SystemInformation.VirtualScreen; var virtualScreen = SystemInformation.VirtualScreen;
var dpiScale = GetDpiScale(); var source = PresentationSource.FromVisual(inkCanvas);
var virtualLeftDip = virtualScreen.Left / dpiScale; var transformToDevice = source?.CompositionTarget?.TransformToDevice ?? Matrix.Identity;
var virtualTopDip = virtualScreen.Top / dpiScale;
var inkTopLeftInWindow = inkCanvas.TranslatePoint(new Point(0, 0), this); // PointToScreen 返回WPF坐标(DIP),统一转换为设备像素后再与 VirtualScreen 对齐
var inkRectDip = new Rect( var inkTopLeftDip = inkCanvas.PointToScreen(new Point(0, 0));
(Left + inkTopLeftInWindow.X) - virtualLeftDip, var inkTopLeftPx = transformToDevice.Transform(inkTopLeftDip);
(Top + inkTopLeftInWindow.Y) - virtualTopDip,
inkCanvas.ActualWidth, var inkRectPx = new Rect(
inkCanvas.ActualHeight); 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 drawingVisual = new DrawingVisual(); var drawingVisual = new DrawingVisual();
using (var dc = drawingVisual.RenderOpen()) using (var dc = drawingVisual.RenderOpen())
@@ -371,15 +373,14 @@ namespace Ink_Canvas
{ {
Stretch = Stretch.Fill Stretch = Stretch.Fill
}; };
dc.DrawRectangle(visualBrush, null, inkRectDip); dc.DrawRectangle(visualBrush, null, inkRectPx);
} }
var dpi = 96.0 * dpiScale;
var rtb = new RenderTargetBitmap( var rtb = new RenderTargetBitmap(
Math.Max(1, virtualScreen.Width), Math.Max(1, virtualScreen.Width),
Math.Max(1, virtualScreen.Height), Math.Max(1, virtualScreen.Height),
dpi, 96,
dpi, 96,
PixelFormats.Pbgra32); PixelFormats.Pbgra32);
rtb.Render(drawingVisual); rtb.Render(drawingVisual);
rtb.Freeze(); rtb.Freeze();