C# 画布上的绘图未正确保存WPF
我在画布中有一个图像,用户可以在图像中单击,并在用户单击的位置显示一个绿色点 我想将图像保存在内存流中以供以后使用,所有图像保存都很好,除了似乎没有正确绘制的点,我的猜测是关于绘制绿点时必须应用的屏幕比例,因为显示的图像比源图像小 XAML: OnMouseLeftButtonDown(用于绘制椭圆的单击方法) 有什么办法可以纠正这种行为吗C# 画布上的绘图未正确保存WPF,c#,wpf,C#,Wpf,我在画布中有一个图像,用户可以在图像中单击,并在用户单击的位置显示一个绿色点 我想将图像保存在内存流中以供以后使用,所有图像保存都很好,除了似乎没有正确绘制的点,我的猜测是关于绘制绿点时必须应用的屏幕比例,因为显示的图像比源图像小 XAML: OnMouseLeftButtonDown(用于绘制椭圆的单击方法) 有什么办法可以纠正这种行为吗 提前谢谢 只要在代码中设置UIElement的属性,它就不会立即呈现。只有在返回该方法后才能执行此操作 在这种情况下,仅在更新其位置后尝试保存省略号将不
提前谢谢 只要在代码中设置UIElement的属性,它就不会立即呈现。只有在返回该方法后才能执行此操作 在这种情况下,仅在更新其位置后尝试保存省略号将不会保存新位置,而是保存其原始位置(0,0),因为其未设置 要解决此问题,请将Save()方法移动到另一个事件或调用
ImageCanvas.UpdateLayout();
更新省略号图标的位置后。您的问题是,您没有显示如何在单击时添加该点。我认为,如果单击时将该点添加到正确的位置,屏幕比例不会有问题。您是否设置了省略号的位置并用相同的方法保存?感谢您的评论,我已经编辑了问题以添加所需的代码@ShivaniKatukota是的,我现在正在这样做,稍后我将从中提取保存方法。在另一个事件中提取保存方法,然后尝试…我有一个类似的问题,椭圆图标的位置在该事件完成之前不会更新,所以在保存时总是为我保存最后一点。你只需保存我的一天,如果你详细说明答案,我会马上接受,谢谢!
public void DrawEllipse()
{
// Adjust To Canvas
(double x, double y) = AdjustToCanvas(Mouse.GetPosition(ImageCanvas));
// Center Ellipse
x -= EllipseClick.Width / 2;
y -= EllipseClick.Height / 2;
Canvas.SetLeft(EllipseClick, x);
Canvas.SetTop(EllipseClick, y);
}
public void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DrawEllipse();
Point point = Mouse.GetPosition(SelectedPartImage);
if (!(point.ConvertWPFPointToImagePoint(
SelectedPartImageSource.PixelWidth,
SelectedPartImageSource.PixelHeight,
SelectedPartImage.ActualWidth,
SelectedPartImage.ActualHeight))
{
return;
}
// CheckAlpha checks that the clicked point is inside the image and not outside of it.
SelectPositionSuccess = CheckAlpha((int)point.X, (int)point.Y);
EllipseClick.Visibility = SelectPositionSuccess ? Visibility.Visible : Visibility.Hidden;
if (SelectPositionSuccess)
{
//Saving the Canvas
RenderTargetBitmap rtb = new RenderTargetBitmap(
(int)SelectedPartImageSource.Width,
(int)SelectedPartImageSource.Height,
96d,
96d,
System.Windows.Media.PixelFormats.Default);
rtb.Render(ImageCanvas);
//endcode as PNG
PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
pngEncoder.Frames.Add(BitmapFrame.Create(rtb));
//save to memory stream
System.IO.MemoryStream ms = new System.IO.MemoryStream();
pngEncoder.Save(ms);
ms.Close();
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = ms;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
System.IO.File.WriteAllBytes("test.png", ms.ToArray());
}
}
ImageCanvas.UpdateLayout();