C# 移动UWP InkStrokes进行屏幕外渲染

C# 移动UWP InkStrokes进行屏幕外渲染,c#,uwp,uwp-xaml,inkcanvas,C#,Uwp,Uwp Xaml,Inkcanvas,我正在捕获笔划,需要在背景中创建笔划的缩放位图图像。无论墨水的边框有多大,捕获的图像都需要具有统一的大小 例如,如果绘制了原始墨迹笔划,并且墨迹画布上的上/左边界框为100100,大小为200200,我希望墨迹从新渲染位图的0,0开始,该位图的大小为50,50(现在忽略笔划宽度的影响) 我已经知道了如何缩放墨水笔划(谢谢),但没有知道如何移动笔划。现在,我似乎必须创建一个与InkCanvas大小相同的位图,渲染缩放后的墨水,然后将更大的图像裁剪到正确的大小 我尝试过使用Inkstrow.Poin

我正在捕获笔划,需要在背景中创建笔划的缩放位图图像。无论墨水的边框有多大,捕获的图像都需要具有统一的大小

例如,如果绘制了原始墨迹笔划,并且墨迹画布上的上/左边界框为100100,大小为200200,我希望墨迹从新渲染位图的0,0开始,该位图的大小为50,50(现在忽略笔划宽度的影响)

我已经知道了如何缩放墨水笔划(谢谢),但没有知道如何移动笔划。现在,我似乎必须创建一个与InkCanvas大小相同的位图,渲染缩放后的墨水,然后将更大的图像裁剪到正确的大小

我尝试过使用Inkstrow.PointTranslate via

但是坐标不正确


非常感谢您的帮助。

您可以通过矩阵相乘来组合变换。这对我有用

var strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();

var boundingBox = inkCanvas.InkPresenter.StrokeContainer.BoundingRect;

var matrix1 = Matrix3x2.CreateTranslation((float)-boundingBox.X, (float)-boundingBox.Y);
var matrix2 = Matrix3x2.CreateScale(0.5f);

var builder = new InkStrokeBuilder();
var newStrokeList = new List<InkStroke>();
foreach (var stroke in strokes)
{
    newStrokeList.Add(builder.CreateStrokeFromInkPoints
        (stroke.GetInkPoints(), matrix1 * matrix2));
}

//Add the translated and scaled strokes to the inkcanvas
inkCanvas.InkPresenter.StrokeContainer.AddStrokes(newStrokeList);
var strokes=inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
var boundingBox=inkCanvas.InkPresenter.StrokeContainer.BoundingRect;
var matrix1=Matrix3x2.CreateTranslation((float)-boundingBox.X,(float)-boundingBox.Y);
var matrix2=Matrix3x2.CreateScale(0.5f);
var builder=新的InkStrokeBuilder();
var newStrokeList=新列表();
foreach(笔划中的变量笔划)
{
newStrokeList.Add(builder.CreateStrokeFromInkPoints
(stroke.GetInkPoints(),matrix1*matrix2));
}
//将转换和缩放的笔划添加到inkcanvas
inkCanvas.InkPresenter.StrokeContainer.AddStrokes(newStrokeList);

也许我仍然做了一些错误的事情,但您似乎无法将InkStrokeBuilder.CreateStrokeFromInkPoints与多种转换一起使用。我尝试了各种组合/方法,但都没有成功

这是我的解决方案

 private static IList<InkStroke> GetScaledAndTransformedStrokes(IList<InkStroke> strokeList, float scale)
        {
            var builder = new InkStrokeBuilder();
            var newStrokeList = new List<InkStroke>();
            var boundingBox = strokeList.GetBoundingBox();

            foreach (var singleStroke in strokeList)
            {  
                var translateMatrix = new Matrix(1, 0, 0, 1, -boundingBox.X, -boundingBox.Y);

                var newInkPoints = new List<InkPoint>();
                var originalInkPoints = singleStroke.GetInkPoints();
                foreach (var point in originalInkPoints)
                {
                    var newPosition = translateMatrix.Transform(point.Position);
                    var newInkPoint = new InkPoint(newPosition, point.Pressure, point.TiltX, point.TiltY, point.Timestamp);
                    newInkPoints.Add(newInkPoint);
                }

                var newStroke = builder.CreateStrokeFromInkPoints(newInkPoints, new Matrix3x2(scale, 0, 0, scale, 0, 0));

                newStrokeList.Add(newStroke);
            }

            return newStrokeList;
        }
私有静态IList GetScaledAndTransformedStrokes(IList strokeList,浮点比例)
{
var builder=新的InkStrokeBuilder();
var newStrokeList=新列表();
var boundingBox=strokeList.GetBoundingBox();
foreach(strokeList中的var singleStroke)
{  
var translateMatrix=新矩阵(1,0,0,1,-boundingBox.X,-boundingBox.Y);
var newInkPoints=新列表();
var originalInkPoints=singleStroke.GetInkPoints();
foreach(原始AlinkPoints中的var点)
{
var newPosition=translateMatrix.Transform(点位置);
var newInkPoint=新InkPoint(新位置、点压力、点倾斜X、点倾斜Y、点时间戳);
newInkPoints.Add(newInkPoint);
}
var newStroke=builder.CreateStrokeFromInkPoints(newInkPoints,newmatrix3x2(scale,0,0,scale,0,0));
newStrokeList.Add(newStroke);
}
返回新闻记者;
}
最后,我不得不应用我自己的平移变换,然后使用builder.CreateStrokeFromInkPoints并应用比例矩阵来获得我想要的结果。GetBoundingBox是我自己的扩展:

 public static class RectExtensions
    {
        public static Rect CombineWith(this Rect r, Rect rect)
        {
            var top = (r.Top < rect.Top) ? r.Top : rect.Top;
            var left = (r.Left < rect.Left) ? r.Left : rect.Left;
            var bottom = (r.Bottom < rect.Bottom) ? rect.Bottom : r.Bottom;
            var right = (r.Right < rect.Right) ? rect.Right : r.Right;

            var newRect = new Rect(new Point(left, top), new Point(right, bottom));
            return newRect;
        }
    }
公共静态类扩展
{
公共静态Rect组合(此Rect r,Rect Rect)
{
var-top=(r.top
我也这么认为,但似乎您只能使用内置的ink API应用一个转换。可以缩放或平移,但不能同时缩放和平移。也许我还是做错了什么,但是我发布了一个对我有用的答案。就是这样!非常感谢。从来没有想过要乘矩阵。我数学不太好。:)我通过将2个矩阵相乘成功地实现了这一点。请试试这个版本。
 public static class RectExtensions
    {
        public static Rect CombineWith(this Rect r, Rect rect)
        {
            var top = (r.Top < rect.Top) ? r.Top : rect.Top;
            var left = (r.Left < rect.Left) ? r.Left : rect.Left;
            var bottom = (r.Bottom < rect.Bottom) ? rect.Bottom : r.Bottom;
            var right = (r.Right < rect.Right) ? rect.Right : r.Right;

            var newRect = new Rect(new Point(left, top), new Point(right, bottom));
            return newRect;
        }
    }