• 2018-12-27-WPF-从-DrawingVisual-转-BitmapImage-图片


    title author date CreateTime categories
    WPF 从 DrawingVisual 转 BitmapImage 图片
    lindexi
    2018-12-27 11:31:52 +0800
    2018-12-23 12:4:51 +0800
    WPF

    有一些库的设计是需要传入一个 BitmapImage 图片,但是我需要从界面代码创建图片,我没有文件,如何通过 DrawingVisual 画出的控件转换 BitmapImage 传给库? 需要将 DrawingVisual 转为 RenderTargetBitmap 然后将 RenderTargetBitmap 转为 BitmapImage 才可以

    先创建一个 DrawingVisual 在里面绘制一些内容

                    DrawingVisual drawingVisual = new DrawingVisual();
                    DrawingContext drawingContext = drawingVisual.RenderOpen();
    
                    // 画出界面
                    
                    drawingContext.Close();

    如在里面写文字

                    DrawingVisual drawingVisual = new DrawingVisual();
                    DrawingContext drawingContext = drawingVisual.RenderOpen();
    
                    drawingContext.DrawText(new FormattedText("欢迎访问我博客 http://lindexi.gitee.io 里面有大量 UWP WPF 博客",
                        CultureInfo.GetCultureInfo("zh-cn"),
                        FlowDirection.LeftToRight,
                        new Typeface("Verdana"),
                        36, System.Windows.Media.Brushes.Black),
                        new System.Windows.Point(200, 116));
                    
                    drawingContext.Close();

    写完之后可以将他转换为 RenderTargetBitmap 请看代码

                      RenderTargetBitmap bmp = new RenderTargetBitmap(宽度, 高度, 96, 96, PixelFormats.Pbgra32);
                    bmp.Render(drawingVisual);

    需要自己知道截图的宽度和高度才可以,另外这里的 96 是 dpi 的大小

    将 DrawingVisual 转 RenderTargetBitmap 就可以通过 PngBitmapEncoder 将 RenderTargetBitmap 转图片

                    var bitmapImage = new BitmapImage();
                    var bitmapEncoder = new PngBitmapEncoder();
                    bitmapEncoder.Frames.Add(BitmapFrame.Create(bmp));
    
                    using (var stream = new MemoryStream())
                    {
                        bitmapEncoder.Save(stream);
                        stream.Seek(0, SeekOrigin.Begin);
    
                        bitmapImage.BeginInit();
                        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                        bitmapImage.StreamSource = stream;
                        bitmapImage.EndInit();
                    }

    通过这个方法就可以将 DrawingVisual 转 BitmapImage 虽然这个方法的速度比较慢

    WPF 通过 DrawingContext DrawImage 绘制图片

  • 相关阅读:
    dir 函数
    模块的 __name__
    from..import 语句
    pass
    可变参数
    python 中的一点新知识
    Numpy中的一点小知识
    使用ipython %matplotlib inline
    numpy.random.rand
    Python:numpy中shape和reshape的用法
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086378.html
Copyright © 2020-2023  润新知