C# 缩放画布墨迹
我用相机拍了一张照片,用它作为InkCanvas的背景,让用户在上面画 当用户保存其图形时,我将缩放图形以匹配背景中图像的大小。我无法调整原始图像的大小 但是,当笔划的长度和位置被缩放时,宽度不会被缩放。 在StackOverflow中滚动时,我发现有人说您还需要在C# 缩放画布墨迹,c#,canvas,uwp,inkcanvas,C#,Canvas,Uwp,Inkcanvas,我用相机拍了一张照片,用它作为InkCanvas的背景,让用户在上面画 当用户保存其图形时,我将缩放图形以匹配背景中图像的大小。我无法调整原始图像的大小 但是,当笔划的长度和位置被缩放时,宽度不会被缩放。 在StackOverflow中滚动时,我发现有人说您还需要在InkStroke.DrawingAttributes.PenTipTransform以及InkStroke.PointTransform上设置比例,但当我尝试将该值设置为比例时,该值不会改变 原始值 新价值观 如果您能告诉我如何设
InkStroke.DrawingAttributes.PenTipTransform
以及InkStroke.PointTransform
上设置比例,但当我尝试将该值设置为比例时,该值不会改变
原始值
新价值观
如果您能告诉我如何设置此值,或者以其他方式设置相同的值,我们将不胜感激
谢谢
用户界面代码
<!-- 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,用户可以使用画布在图像上绘制,但我无法在屏幕上显示整个图像,因此它会缩小以适应画布的大小。画布(在本例中)的分辨率为1012x759
保存图像时,绘图的位置将按比例放大,以匹配图像的完整大小。但笔划的宽度并不相同
另外,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);
}
StorageFile inputFile=null;
inputFile=await-StorageFile.GetFileFromPathAsync(_-image.fullPath);
高度=(int)inkCanvas.ActualHeight;
宽度=(int)inkCanvas.ActualWidth;
双标度=0;
双刻度=0;
双偏置=0;
双偏移量x=0;
双宽度刻度=1;
if(inputFile!=null)
{
var prop=await inputFile.Properties.GetImagePropertiesAsync();
偏移量x=(双)道具宽度-宽度;
偏移量=(双)道具高度-高度;
scalex=((双)道具宽度-宽度)/宽度;
scaley=((双)道具高度-高度)/高度;
宽度=(int)prop.width;
高度=(int)道具高度;
宽度比例=1+((比例x比例)/2);
}
var strokes=inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
List ExpandedStrokes=新列表();
foreach(笔划中的变量笔划)
{
InkStroke strk=stroke.Clone();
Matrix3x2 scaleMatrix=Matrix3x2.CreateScale(1+(浮点)scalex,1+(浮点)scaley);
strk.PointTransform=scaleMatrix;
strk.DrawingAttributes.pentipttransform=scaleMatrix;
ExpandedStrokes.Add(strk);
}
StorageFolder StorageFolder=ApplicationData.Current.LocalFolder;
CanvasDevice=CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget=新的CanvasRenderTarget(设备、宽度、高度,96);
使用(var ds=renderTarget.CreateDrawingSession())
{
ds.清晰(颜色:白色);
if(inputFile!=null)
{
使用(CanvasBitmap image=wait CanvasBitmap.LoadAsync(设备,inputFile.Path,96))
{
ds.DrawImage(图像);
}
}
ds.DrawInk(展开笔划);
}
使用(var fileStream=await inputFile.OpenAsync(FileAccessMode.ReadWrite))
{
等待renderTarget.SaveAsync(fileStream,CanvasBitmapFileFormat.Jpeg,1f);
}
奔腾的规模可能不正确,但只是想让它有所改变
示例图像
缩放前(1012x759)
缩放后(3264x2448)
用于调整笔划长度,它不会缩放笔划的厚度。如果要显示具有相应宽度的笔划,可以使用InkCanvas.RenderTransform
并设置其ScaleX和ScaleY,但这不会影响笔划厚度的实际效果,它只会调整InkCanvas的大小,使笔划看起来像是缩放的。似乎没有一个属性可以更改在图像上绘制的笔划的实际厚度
实际上,当您拍摄一张照片并将其作为背景图像放在
Image
控件中时,用户可以在该图像上绘制,您可能会让用户选择具有不同配置的笔进行绘制。在用户完成绘图后,他们将使用笔划保存图像,这应该是他们想要的效果。也就是说,我们用钢笔在一个小的图像上画画,我们应该确保笔划在正确的位置,如果图像变大,笔划应该自动改变,我认为我们不应该再改变笔划比例。你能提供更多的代码并澄清你想要达到的真实效果吗?如果用户在图像上绘制笔划,他们会希望在那里绘制笔划,为什么要再次缩放?那么,缩放图形以匹配图像大小的意思是什么?如果你能提供最低限度的样品来帮助我了解你的问题,那就更好了。