zoukankan      html  css  js  c++  java
  • 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 绘制图片

  • 相关阅读:
    monkeyrunner1
    也来复习一下数据库的一些知识1
    Monkey原理
    总结一下app客户端的测试点
    从侧计--mongkeyScript问题
    从侧计----monkeyScript实例----开启墨迹天气并添加城市,最后关闭app
    求助:关于sql如何统计时间的问题
    虚拟机无法分配内存 virtual memory exhausted: Cannot allocate memory
    Ubuntu14.04安装libusb
    E: 软件包 ffmpeg 没有可供安装的候选者
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086379.html
Copyright © 2011-2022 走看看