在WPF程序中将控件所呈现的内容保存成图像

有的时候,我们需要将控件所呈现的内容保存成图像保存下来,例如:InkCanvas的手写墨迹,WebBrowser中的网页等。可能有人会说,这个不就是截图嘛,找到控件的坐标和大小,调用截图API不就可以了嘛。的确,对于规则的控件来说,通过截图的却可以实现,可是,如果控件不规则或不透明度不是100%,则会把其背景控件的视觉效果也给截取下来。

要实现只对控件进行截图,可以利用RenderTargetBitmap类获取Visual对象的视觉效果,从而实现对控件截图效果。

    RenderTargetBitmap RenderVisaulToBitmap(Visual vsual, int width, int height)
    {
        var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
        rtb.Render(vsual);

        return rtb;
    }

这里需要说明一下,Visual对象的AlignmentMargin等影响布局的属性也会获取下来,例如,对如下按钮截图时,

<Button Content="Button" Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Height="22" />

按钮的起点坐标就不是(0,0),而是(10,10)。如果我们要把按钮的起点起点坐标设置为(0,0),则需要在Button属性把AlignmentMargin等属性去掉。既要去掉AlignmentMargin等属性,又要保持按钮的位置和大小不变,一个简单的做法是在按钮外面添加一个Border,在Broder中设置这些属性(在VisualStudio和Blend中设置一下分组即可,一步即可完成)。

    <Border Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Height="22">
        <Button Content="Button"/>
    </Border>

通过RenderVisaulToBitmap函数,就可以把控件的视觉效果转换为RenderTargetBitmap对象了,RenderTargetBitmap对象继承自BitmapSource,是可以直接在Image控件中显示的。如果要更进一步把它转换为图像,则可以按照我以前的文章给图片加上阴影效果文章所示通过一个PngBitmapEncoderBitmapSource对象保存为图片。

        public enum ImageFormat { JPG, BMP, PNG, GIF, TIF }

        void GenerateImage(BitmapSource bitmap, ImageFormat format, Stream destStream)
        {
            BitmapEncoder encoder = null;

            switch (format)
            {
                case ImageFormat.JPG:
                    encoder = new JpegBitmapEncoder();
                    break;
                case ImageFormat.PNG:
                    encoder = new PngBitmapEncoder();
                    break;
                case ImageFormat.BMP:
                    encoder = new BmpBitmapEncoder();
                    break;
                case ImageFormat.GIF:
                    encoder = new GifBitmapEncoder();
                    break;
                case ImageFormat.TIF:
                    encoder = new TiffBitmapEncoder();
                    break;
                default:
                    throw new InvalidOperationException();
            }

            encoder.Frames.Add(BitmapFrame.Create(bitmap));
            encoder.Save(destStream);
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要打印WPF中Canvas控件内的内容,我们可以使用PrintDialog类来实现。首先,我们需要创建一个PrintDialog对象,并设置它的参数,如打印份数、纸张大小等。然后,我们可以使用PrintDialog的PrintVisual方法来指定要打印的内容,这里可以将Canvas控件传递给该方法。最后,调用PrintDialog的Print方法来开始打印过程。 以下是一个示例代码: ```csharp private void PrintCanvas(Canvas canvas) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { printDialog.PrintTicket.PageOrientation = System.Printing.PageOrientation.Landscape; // 设置打印方向为横向 printDialog.PrintTicket.CopyCount = 1; // 设置打印份数为1 printDialog.PrintVisual(canvas, "Printing Canvas"); } } ``` 至于将Canvas保存为XPS文件并进行预览,我们可以使用XpsDocument类来实现。首先,我们需要创建一个XpsDocument对象,并使用XpsDocument的AddFixedDocument方法创建一个FixedDocument对象。然后,我们可以使用FixedDocument的Pages属性来添加需要保存内容,这里可以将Canvas控件作为一个UIElement添加到Pages中。最后,使用XpsDocument的Write方法将内容保存为XPS文件,并使用SaveFileDialog类来选择保存路径和文件名。 以下是一个示例代码: ```csharp private void SaveCanvasAsXps(Canvas canvas) { XpsDocument xpsDoc = new XpsDocument("output.xps", FileAccess.Write); XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc); FixedDocument fixedDoc = new FixedDocument(); PageContent pageContent = new PageContent(); ((IAddChild)pageContent).AddChild(canvas); fixedDoc.Pages.Add(pageContent); writer.Write(fixedDoc); xpsDoc.Close(); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "XPS Files (*.xps)|*.xps|All Files (*.*)|*.*"; if (openFileDialog.ShowDialog() == true) { XpsDocumentPreviewWindow previewWindow = new XpsDocumentPreviewWindow(openFileDialog.FileName); previewWindow.ShowDialog(); } } ``` 这样,我们就可以将Canvas控件内容保存为XPS文件,并在预览窗口中查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值