当前位置: 首页 > article >正文

笔记:DrawingContext和GDI+对比简介

一、目的:分享一个wpf中级控件,鼠标放上展开其他控件的效果

        DrawingContext 和 GDI+ 的 Graphics 类都是用于绘图的技术,但它们属于不同的图形库和框架,适用于不同的场景。让我们详细比较一下这两者。

二、对比


DrawingContext


        DrawingContext 是 WPF(Windows Presentation Foundation)中的一个类,用于创建和渲染矢量图形。它是 DrawingVisual 类的一部分,通常用于高效的图形绘制。


优点


1.    硬件加速:WPF 使用 DirectX 进行渲染,能够利用 GPU 进行硬件加速,提供更高的性能。
2.    矢量图形:支持矢量图形,能够在不同分辨率下保持高质量。
3.    集成性:与 WPF 的其他功能(如数据绑定、样式和动画)无缝集成。
4.    高效:DrawingContext 是轻量级的,适合用于需要高效绘制的大量图形对象。


示例代码
以下是一个使用 DrawingContext 绘制简单图形的示例:

        DrawingVisual drawingVisual = new DrawingVisual();
        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            drawingContext.DrawRectangle(Brushes.Blue, null, new Rect(50, 50, 100, 100));
            drawingContext.DrawText(
                new FormattedText(
                    "Hello, WPF!",
                    System.Globalization.CultureInfo.InvariantCulture,
                    FlowDirection.LeftToRight,
                    new Typeface("Verdana"),
                    32,
                    Brushes.White),
                new Point(60, 60));
        }

        RenderTargetBitmap bmp = new RenderTargetBitmap(200, 200, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(drawingVisual);

        // Save the bitmap to a file
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmp));
        using (var stream = new System.IO.FileStream("output.png", System.IO.FileMode.Create))
        {
            encoder.Save(stream);
        }

GDI+ (System.Drawing)


        GDI+ 是 .NET Framework 中的图形库,主要用于 Windows Forms 应用程序。它提供了丰富的绘图功能,适用于位图图形的创建和操作。


优点


1.    广泛支持:GDI+ 在 Windows 平台上有广泛的支持,适用于各种类型的应用程序。
2.    丰富的功能:提供了丰富的绘图功能,包括绘制图形、文本、图像等。
3.    易于使用:API 设计简单易用,适合快速开发。


示例代码
以下是一个使用 GDI+ 绘制简单图形的示例: 

        Bitmap bitmap = new Bitmap(200, 200);
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.Clear(Color.White);
            g.FillRectangle(Brushes.Blue, 50, 50, 100, 100);
            g.DrawString("Hello, GDI+", new Font("Verdana", 16), Brushes.White, new PointF(60, 60));
        }

        // Save the bitmap to a file
        bitmap.Save("output.png", System.Drawing.Imaging.ImageFormat.Png);

对比总结


•    性能:DrawingContext 使用硬件加速,性能通常优于 GDI+,特别是在需要高效绘制大量图形对象的场景。


•    图形类型:DrawingContext 适合矢量图形,GDI+ 适合位图图形。


•    集成性:DrawingContext 与 WPF 集成更好,支持数据绑定、动画等功能;GDI+ 更适合 Windows Forms 应用。


•    平台支持:GDI+ 在 Windows 平台上有更广泛的支持,而 DrawingContext 主要用于 WPF 应用。


选择建议


•    WPF 应用:如果你在开发 WPF 应用并需要高效的矢量图形绘制,DrawingContext 是更好的选择。
•    Windows Forms 应用:如果你在开发 Windows Forms 应用并需要操作位图图形,GDI+ 更适合。 

需要了解的知识点 

DrawingContext Class (System.Windows.Media) | Microsoft Learn

DrawingVisual Class (System.Windows.Media) | Microsoft Learn 

Graphics 类 (System.Drawing) | Microsoft Learn 

System.Windows.Controls 命名空间 | Microsoft Learn

控件库 - WPF .NET Framework | Microsoft Learn

WPF 介绍 | Microsoft Learn

XAML概述 - WPF .NET | Microsoft Learn

Windows Presentation Foundation 简介 - WPF .NET | Microsoft Learn

使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

了解更多

适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

Reference Source

Sysinternals - Sysinternals | Microsoft Learn

Windows app development documentation - Windows apps | Microsoft Learn

欢迎使用 Expression Blend | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/?view=netdesktop-7.0&WT.mc_id=MVP_380318

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频


http://www.kler.cn/news/314697.html

相关文章:

  • 【Python】探索 TensorFlow:构建强大的机器学习模型
  • PostgreSQL技术内幕11:PostgreSQL事务原理解析-MVCC
  • 区块链DAPP质押系统开发
  • python中迭代器和可迭代对象
  • 【系统架构设计师】特定领域软件架构(经典习题)
  • 边缘智能-大模型架构初探
  • WebGL基础知识快速入门
  • 安装nuxt3
  • 「iOS」viewController的生命周期
  • Android TV RecyclerView列表获得焦点左右换行
  • 如何在Mac上安装多个Python环境
  • Spring Mybatis PageHelper分页插件 总结
  • MySQL篇(SQL优化)(持续更新迭代)
  • Android Studio 开发快速获取开发版和发布版SHA1和MD5
  • 汽车美容服务管理系统的数据库设计与数据操作
  • nvm 下载node报错:Could not retrieve https://nodejs.org/dist/index.json.
  • 奇安信渗透2面经验分享
  • HarmonyOS第一课-应用程序框架基础习题答案
  • 邮件安全治理
  • 解决nginx代理SSE接口的响应没有流式返回
  • 详细分析Spring的动态代理机制
  • zynq的PS端mac与RTL8211F的连接要点
  • 微服务架构中的负载均衡与服务注册中心(Nacos)
  • Cursor免费 GPT-4 IDE 工具的保姆级使用教程
  • Spring01
  • C# 中的NPOI 库
  • 生物信息常用编辑器:轻量高效的VS Code
  • 山东潍坊戴尔存储服务器维修 md3800f raid恢复
  • Docker Registry API best practice 【Docker Registry API 最佳实践】
  • 解决mybatis plus 中 FastjsonTypeHandler无法正确反序列化List类型的问题