Я фотографирую с помощью камеры, использую ее в качестве фона для InkCanvas и позволяю пользователю рисовать поверх.
Когда пользователь сохраняет свой рисунок, я масштабирую чертеж, чтобы он соответствовал размеру изображения на заднем плане. Я не могу изменить размер исходного изображения.
Однако, в то время как длина и положение штрихов масштабируются, ширина не изменяется.
Прокручивая StackOverflow, я нашел людей, которые говорили, что вам также нужно установить шкалу на InkStroke.DrawingAttributes.PenTipTransform
, а также InkStroke.PointTransform
, но когда я пытаюсь установить значение на шкалу, значение не меняется.
Origional 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)
после масштабирования (3264x2448)