C# 如何保存完整的InkCanvas?

C# 如何保存完整的InkCanvas?,c#,wpf,canvas,C#,Wpf,Canvas,我正在尝试从InkCanvas保存一幅绘图。我还实现了缩放功能和滚动条,以增加InkCanvas的大小。保存的图片取决于缩放,即使大小为原始大小,也不会保存完整的InkCanvas InkCanvas的XAML: <ScrollViewer Grid.Row="2" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <Border x:Name="brd_borger" M

我正在尝试从InkCanvas保存一幅绘图。我还实现了缩放功能和滚动条,以增加InkCanvas的大小。保存的图片取决于缩放,即使大小为原始大小,也不会保存完整的InkCanvas

InkCanvas的XAML:

<ScrollViewer Grid.Row="2" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
    <Border x:Name="brd_borger"  MouseWheel="cnv_MouseWheel" Background="Aqua" Height="Auto" Width="Auto">
        <InkCanvas x:Name="cnv" Width="Auto" Height="Auto" Background="Aqua" 
               PreviewMouseLeftButtonDown="cnv_MouseLeftButtonDown"
               PreviewMouseRightButtonDown="cnv_MouseRightButtonDown" 
               SelectionChanged="cnv_SelectionChanged"
               SelectionMoving="cnv_SelectionMoving"
               SelectionMoved="cnv_SelectionMoved"

               EditingMode="None">

        </InkCanvas>
    </Border>
</ScrollViewer>
保存代码:

private void Save_Click(object sender, RoutedEventArgs e)
    {
        SaveFileDialog dlg = new SaveFileDialog();
        dlg.DefaultExt = ".png";
        dlg.Filter = ODLG_FILTER_IMAGES;

        Nullable<bool> result = dlg.ShowDialog();

        if (result == true)
        {
            string filename = dlg.FileName;
            MemoryStream ms = new MemoryStream();
            FileStream fs = new FileStream(filename, FileMode.Create);

            RenderTargetBitmap rtb = new RenderTargetBitmap((int)cnv.Width, (int)cnv.Height, 96d, 96d, PixelFormats.Default);
            rtb.Render(cnv);
            BmpBitmapEncoder encoder = new BmpBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(rtb));

            encoder.Save(fs);
            fs.Close();

        }
    }
private void Save\u单击(对象发送者,路由目标)
{
SaveFileDialog dlg=新建SaveFileDialog();
dlg.DefaultExt=“.png”;
dlg.Filter=ODLG\u Filter\u图像;
可为空的结果=dlg.ShowDialog();
如果(结果==真)
{
字符串文件名=dlg.filename;
MemoryStream ms=新的MemoryStream();
FileStream fs=newfilestream(文件名,FileMode.Create);
RenderTargetBitmap rtb=新的RenderTargetBitmap((int)cnv.Width,(int)cnv.Height,96d,96d,PixelFormats.Default);
rtb.渲染(cnv);
BmpBitmapEncoder编码器=新的BmpBitmapEncoder();
Add(BitmapFrame.Create(rtb));
编码器保存(fs);
fs.Close();
}
}

由于您不希望图像大小与
InkCanvas
的实际大小相同,因此需要指定实际目标图像大小。然后,您可以使用
DrawingContext
VisualBrush
创建图像:

private void Save_Click(object sender, RoutedEventArgs e)
{
    SaveFileDialog dlg = new SaveFileDialog();
    dlg.DefaultExt = ".png";
    dlg.Filter = ODLG_FILTER_IMAGES;

    if (dlg.ShowDialog() == true)
    {
        string filename = dlg.FileName;
        MemoryStream ms = new MemoryStream();
        FileStream fs = new FileStream(filename, FileMode.Create);

        //define your image size here...
        const int Width = 200;
        const int Height = 200;
        RenderTargetBitmap rtb = new RenderTargetBitmap(Width, Height, 96d, 96d, PixelFormats.Default);
        Rect bounds = VisualTreeHelper.GetDescendantBounds(cnv);
        DrawingVisual dv = new DrawingVisual();
        using (DrawingContext ctx = dv.RenderOpen())
        {
            VisualBrush vb = new VisualBrush(cnv);
            ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
        }

        rtb.Render(dv); ;
        BmpBitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(rtb));

        encoder.Save(fs);
        fs.Close();
    }
}

图像的目标尺寸是多少?@TheBosco:你试过这个吗?
private void Save_Click(object sender, RoutedEventArgs e)
{
    SaveFileDialog dlg = new SaveFileDialog();
    dlg.DefaultExt = ".png";
    dlg.Filter = ODLG_FILTER_IMAGES;

    if (dlg.ShowDialog() == true)
    {
        string filename = dlg.FileName;
        MemoryStream ms = new MemoryStream();
        FileStream fs = new FileStream(filename, FileMode.Create);

        //define your image size here...
        const int Width = 200;
        const int Height = 200;
        RenderTargetBitmap rtb = new RenderTargetBitmap(Width, Height, 96d, 96d, PixelFormats.Default);
        Rect bounds = VisualTreeHelper.GetDescendantBounds(cnv);
        DrawingVisual dv = new DrawingVisual();
        using (DrawingContext ctx = dv.RenderOpen())
        {
            VisualBrush vb = new VisualBrush(cnv);
            ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
        }

        rtb.Render(dv); ;
        BmpBitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(rtb));

        encoder.Save(fs);
        fs.Close();
    }
}