Перемещение чернил UWP для рендеринга за пределами экрана - PullRequest
0 голосов
/ 31 августа 2018

Я снимаю InkStrokes и мне нужно создать масштабированное растровое изображение штрихов на заднем плане. Захваченные изображения должны быть одинакового размера независимо от размера ограничительной рамки чернил.

Например, если нарисован исходный штрих чернил, а верхний / левый ограничивающий прямоугольник равен 100 100, а на холсте для чернил размер 200 200, я хочу, чтобы чернила начинались с 0,0 нового отрисованного растрового изображения, равного 50,50. размер (игнорируйте влияние ширины хода прямо сейчас).

Я понял, как масштабировать чернильные мазки (спасибо StackOverflow ), а не как перемещать мазки. Сейчас мне кажется, что мне нужно создать растровое изображение размером InkCanvas , визуализировать масштабированные чернила, а затем обрезать увеличенное изображение до нужного размера.

Я пытался использовать InkStroke.PointTranslate через

var scaleMatrix = Matrix3x2.CreateScale(scale);
scaleMatrix.Translation = -offset; // top/left of ink stroke bounding box
stroke.PointTransform = scaleMatrix;

Но координаты не получаются правильными.

Любая помощь высоко ценится.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Возможно, я все еще делал что-то не так, но, похоже, вы не можете использовать 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;
        }
    }
0 голосов
/ 01 сентября 2018

Вы можете комбинировать преобразования путем умножения матриц. Это работает для меня

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