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

 更新时间:2022年06月18日 10:12:27   作者:天方  
这篇文章介绍了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对象的Alignment、Margin等影响布局的属性也会获取下来,例如,对如下按钮截图时,

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

按钮的起点坐标就不是(0,0),而是(10,10)。如果我们要把按钮的起点起点坐标设置为(0,0),则需要在Button属性把Alignment、Margin等属性去掉。既要去掉Alignment、Margin等属性,又要保持按钮的位置和大小不变,一个简单的做法是在按钮外面添加一个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控件中显示的。如果要更进一步把它转换为图像,则可以按照我以前的文章给图片加上阴影效果文章所示通过一个PngBitmapEncoder把BitmapSource对象保存为图片。

        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);
        }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • c#多线程之间的排他锁的实现

    c#多线程之间的排他锁的实现

    我们很多时候会碰到这样的问题,使用多线程刷一个表的数据时需要多个线程不能重复提取数据,那么这个时候就需要使用到线程的排他锁了,本文就详细的介绍一下
    2021-08-08
  • C# 文字代码页 文字编码的代码页名称速查表

    C# 文字代码页 文字编码的代码页名称速查表

    最近有项目需要用到韩语,日语的编码转换,最重要的就是需要一个代码页的对照,找了一下,最新的代码页或者说编码表如下
    2011-11-11
  • 深入Resource实现多语言支持的应用详解

    深入Resource实现多语言支持的应用详解

    本篇文章是对Resource实现多语言支持的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    这篇文章主要介绍了C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例,每次解密时从密文中截取前16位,这就是实现随机的奥秘,本文同时给出了实现代码,需要的朋友可以参考下
    2015-07-07
  • C#创建Windows服务的图文教程

    C#创建Windows服务的图文教程

    本文主要介绍了C#创建Windows服务的图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • c#利用webmail邮件系统发送邮件示例分享

    c#利用webmail邮件系统发送邮件示例分享

    在C#中发送邮件的方式有2种,一种是使用webmail方式进行发送,另外一种就是采用netmail发送的方式,这篇文章介绍了c#使用webmail方式发送邮件示例,大家参考使用吧
    2014-01-01
  • MessageBox的Buttons和三级联动效果

    MessageBox的Buttons和三级联动效果

    这篇文章主要介绍了MessageBox的Buttons和三级联动的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Unity3D实现人物转向与移动

    Unity3D实现人物转向与移动

    这篇文章主要为大家详细介绍了Unity3D实现人物转向与移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#如何通过T4自动生成代码详解

    C#如何通过T4自动生成代码详解

    这篇文章主要给大家介绍了关于C#如何通过T4自动生成代码的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 浅谈C#指针问题

    浅谈C#指针问题

    在C#中,有时候希望通过指针来操作内存,这样可以提高效率。我们可以用unsafe关键字修饰含有指针操作的程序段
    2016-01-01

最新评论