首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于屏幕外渲染的移动UWP InkStrokes

用于屏幕外渲染的移动UWP InkStrokes
EN

Stack Overflow用户
提问于 2018-08-31 15:44:40
回答 2查看 457关注 0票数 2

我正在捕获InkStrokes,并需要在背景中创建笔画的缩放位图图像。无论油墨的包围盒有多大,捕获的图像都必须大小一致。

例如,如果在油墨画布上绘制原始墨迹笔画,并且边框顶部/左侧为100,100,大小为200,200,我希望墨水从新呈现的位图( 50,50大小)的0,0开始(忽略当前笔画宽度的影响)。

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

我试过使用InkStroke.PointTranslate

代码语言:javascript
复制
var scaleMatrix = Matrix3x2.CreateScale(scale);
scaleMatrix.Translation = -offset; // top/left of ink stroke bounding box
stroke.PointTransform = scaleMatrix;

但是坐标不正确。

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-01 04:29:33

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

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2018-09-02 17:09:48

也许我仍然做错了什么,但似乎您不能使用InkStrokeBuilder.CreateStrokeFromInkPoints与多种转换。我尝试了各种各样的组合/方法,只是无法使它发挥作用。

这是我的解决方案。

代码语言:javascript
复制
 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;
        }

最后,我不得不应用我自己的翻译转换,然后使用builder.CreateStrokeFromInkPoints,并应用一个标度矩阵来获得我想要的结果。GetBoundingBox是我自己的扩展:

代码语言:javascript
复制
 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;
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52118890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档