zoukankan      html  css  js  c++  java
  • 在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);
            }

  • 相关阅读:
    禁止网页右键、复制、另存为方法
    js循环99乘法口诀
    js点击判断显示或隐藏-21
    js下拉框-5
    js下拉框-4
    纯css下拉
    asp.net core 关于同步等待异步坑及解决办法
    net core http请求响应中间件 及全局异常中间件小计
    生产环境 前后端分离部署 https 跨域cors netcore3.1 部署小计
    csrediscore实现分布式锁 小计
  • 原文地址:https://www.cnblogs.com/TianFang/p/2714140.html
Copyright © 2011-2022 走看看