Масштабирование холста InkStrokes - PullRequest
0 голосов
/ 03 мая 2018

Я фотографирую с помощью камеры, использую ее в качестве фона для InkCanvas и позволяю пользователю рисовать поверх.

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

Однако, в то время как длина и положение штрихов масштабируются, ширина не изменяется. Прокручивая StackOverflow, я нашел людей, которые говорили, что вам также нужно установить шкалу на InkStroke.DrawingAttributes.PenTipTransform, а также InkStroke.PointTransform, но когда я пытаюсь установить значение на шкалу, значение не меняется.

Origional Values Origional Новые ценности New Values

Будем весьма благодарны за любую информацию о том, как я могу установить это значение или как-то иначе сделать то же самое.

Спасибо

Код интерфейса пользователя

 <!-- Canvas -->
    <Image Grid.Row="1" x:Name="imgImage" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" SizeChanged="imgImage_SizeChanged"/>

    <InkCanvas Grid.Row="1" x:Name="inkCanvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" PointerExited="inkCanvas_PointerExited" Visibility="Collapsed">
        <InkCanvas.RenderTransform>
            <ScaleTransform x:Name="inkCanvasScaleTransform" />
        </InkCanvas.RenderTransform>
    </InkCanvas>

РЕДАКТИРОВАТЬ - Больше информации

Изображение, полученное с помощью камеры, имеет разрешение 3264x244, затем пользователь может рисовать на изображении с помощью холста, но я не могу показать все изображение на экране, поэтому оно уменьшается в соответствии с размером изображения. холст. Полотно (в данном конкретном случае) имеет разрешение 1012х759.

Когда изображение сохранено, местоположение чертежа увеличивается в соответствии с полным размером изображения. но ширина обводки не делает.

P.S. преобразование масштаба в XAML в настоящее время не используется.

СОХРАНИТЬ КОД

StorageFile inputFile = null;
        inputFile = await StorageFile.GetFileFromPathAsync(_image.fullPath);
        height = (int)inkCanvas.ActualHeight;
        width = (int)inkCanvas.ActualWidth;
        double scalex = 0;
        double scaley = 0;
        double offsety = 0;
        double offsetx = 0;
        double widthscale = 1;
        if (inputFile != null)
        {
            var prop = await inputFile.Properties.GetImagePropertiesAsync();
            offsetx = (double)prop.Width - width;
            offsety = (double)prop.Height - height;
            scalex = ((double)prop.Width - width) / width;
            scaley = ((double)prop.Height - height) / height;
            width = (int)prop.Width;
            height = (int)prop.Height;
            widthscale = 1 + ((scalex * scaley) / 2);
        }

        var strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
        List<InkStroke> ExpandedStrokes = new List<InkStroke>();
        foreach (var stroke in strokes)
        {
            InkStroke strk = stroke.Clone();
            Matrix3x2 scaleMatrix = Matrix3x2.CreateScale(1 + (float)scalex, 1 + (float)scaley);
            strk.PointTransform = scaleMatrix;
            strk.DrawingAttributes.PenTipTransform = scaleMatrix;
            ExpandedStrokes.Add(strk);
        }

        StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
        CanvasDevice device = CanvasDevice.GetSharedDevice();
        CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, width, height, 96);
        using (var ds = renderTarget.CreateDrawingSession())
        {
            ds.Clear(Colors.White);
            if (inputFile != null)
            {
                using (CanvasBitmap image = await CanvasBitmap.LoadAsync(device, inputFile.Path, 96))
                {
                    ds.DrawImage(image);
                }
            }
            ds.DrawInk(ExpandedStrokes);
        }
        using (var fileStream = await inputFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
        }

Масштаб для подсказки может быть неправильным, но он просто пытался заставить его внести изменения.

ПРИМЕРНЫЕ ИЗОБРАЖЕНИЯ

до масштабирования (1012x759) Before Scaling

после масштабирования (3264x2448) After Scaling

1 Ответ

0 голосов
/ 08 мая 2018

InkStroke.PointTransform предназначен для изменения длины штрихов, он не будет масштабировать толщину штрихов. Если вы хотите отобразить обводки с соответствующей шириной, вы можете использовать InkCanvas.RenderTransform и установить его ScaleX и ScaleY, но это не повлияет на реальный эффект толщины обводки, он просто регулирует размер InkCanvas, чтобы обводки казались быть масштабированным. Кажется, что нет свойства изменить реальную толщину штрихов, которые были нарисованы на изображениях.

На самом деле, когда вы берете фотографию и помещаете ее в элемент управления Image в качестве фонового изображения, тогда пользователи могут рисовать на этом изображении, вы можете предложить пользователю выбрать перо с другой конфигурацией для рисования. После того, как пользователи закончили рисовать, они сохранят изображение штрихами, это должно быть тем эффектом, который они хотят. То есть, мы используем ручку для рисования на маленьком изображении, мы должны просто убедиться, что штрих в правильном положении, если изображение становится больше, штрихи должны меняться автоматически, я не думаю, что мы должны изменить штрих масштаб снова.

...