fix: correct ink overlay alignment in screenshot capture
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user