亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

移動 UWP InkStrokes 以進行離屏渲染

移動 UWP InkStrokes 以進行離屏渲染

C#
收到一只叮咚 2021-12-25 18:48:17
我正在捕獲InkStrokes并且需要在背景中創建一個縮放的筆畫位圖圖像。無論墨水的邊界框有多大,捕獲的圖像都需要具有統一的大小。例如,如果繪制原始墨水筆劃,并且墨水畫布上的邊界框頂部/左側為 100,100 且大小為 200,200,我希望墨水從新渲染位圖的 0,0 處開始,即 50,50 大?。ê雎袁F在筆畫寬度的影響)。我已經弄清楚如何縮放墨跡筆劃(感謝StackOverflow),但不知道如何移動筆劃。現在,似乎我必須創建一個InkCanvas大小的位圖,渲染縮放后的墨水,然后將更大的圖像裁剪為正確的大小。我試過使用InkStroke.PointTranslate通過var scaleMatrix = Matrix3x2.CreateScale(scale);scaleMatrix.Translation = -offset; // top/left of ink stroke bounding boxstroke.PointTransform = scaleMatrix;但坐標不正確。非常感謝任何幫助。
查看完整描述

2 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

您可以通過矩陣相乘來組合變換。這對我有用


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);


查看完整回答
反對 回復 2021-12-25
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

也許我仍然做錯了什么,但看起來您不能將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;

        }

我最終不得不應用我自己的翻譯轉換,然后使用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;

        }

    }


查看完整回答
反對 回復 2021-12-25
  • 2 回答
  • 0 關注
  • 355 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號