fix: render ink overlay from strokes to remove capture offset
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user