【WPF.NET开发】优化性能:二维图形和图像处理

本文内容

  1. 绘图和形状
  2. StreamGeometry 对象
  3. DrawingVisual 对象
  4. 映像

WPF 提供了多种可按应用程序要求进行优化的 2D 图形和图像处理功能。 本主题提供有关这些方面性能优化的信息。

1、绘图和形状

WPF 提供 Drawing 和 Shape 对象来表示图形绘制内容。 但是,Drawing 对象是比 Shape 对象更为简单的构造,且提供更好的性能特征。

通过 Shape 可将图形形状绘制到屏幕。 因为其派生自 FrameworkElement 类,所以 Shape 对象可用于面板和大多数控件内。

WPF 为图形和绘制服务提供多层访问。 在顶层,Shape 对象易于使用,且提供了布局和事件处理等众多实用功能。 WPF 提供了许多现成可用的形状对象。 所有形状对象都继承自 Shape 类。 可用的形状对象包括 Ellipse、Line、Path、Polygon、Polyline 和 Rectangle。

另一方面,Drawing 对象不是派生自 FrameworkElement 类,且对于绘制形状、图像和文本提供了更轻量的实现。

有四种类型的 Drawing 对象:

  • GeometryDrawing 绘制形状。

  • ImageDrawing 绘制图像。

  • GlyphRunDrawing 绘制文本。

  • DrawingGroup 绘制其他图形。 使用绘图组将其他绘图合并到单个复合绘图。

GeometryDrawing 对象用于绘制几何内容。 Geometry 类及其派生的具体类(例如 CombinedGeometry、EllipseGeometry 和 PathGeometry)提供绘制 2D 图形的方式以及命中测试和剪裁支持。 几何对象可用于定义控件的区域或定义应用于图像的剪裁区域等。 几何对象可以是简单区域(例如矩形和圆形),或者是由两个或多个几何对象创建的复合区域。 通过合并 PathSegment 派生对象(例如 ArcSegment、BezierSegment 和 QuadraticBezierSegment),可创建更复杂的几何区域。

表面上看,Geometry 类和 Shape 类非常相似。 二者都用于绘制 2D 图形,且都具有相似的具体派生类,例如 EllipseGeometry 和 Ellipse。 但是,这两个类集之间存在重大区别。 一方面,Geometry 类缺少 Shape 类的部分功能,例如绘制自身的功能。 若要绘制几何对象,必须使用另一个类(例如 DrawingContext、Drawing 或 Path(值得注意的是 Path 是一个 Shape))来执行绘制操作。 填充、笔划和笔划粗细等绘制属性位于绘制几何对象的类上,而形状对象中包含这些属性。 可以这样来理解这种差别:几何对象定义区域(例如圆形),而形状对象定义区域、定义如何填充区域和设置区域边框并参与布局系统。

由于 Shape 对象派生自 FrameworkElement 类,因此使用这些对象会使应用程序的内存消耗显著增加。 如果对于图形内容确实不需要 FrameworkElement 功能,请考虑使用更轻量的 Drawing 对象。

2、StreamGeometry 对象

在创建几何形状时,StreamGeometry 对象是对 PathGeometry 的轻量替代。 需要描述复杂几何时使用 StreamGeometry。 StreamGeometry 非常适合用于处理许多 PathGeometry 对象,且与使用众多单独的 PathGeometry 对象相比,其性能更佳。

以下示例使用特性语法在 XAML 中创建三角形 StreamGeometry。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><StackPanel><Path Data="F0 M10,100 L100,100 100,50Z" StrokeThickness="1" Stroke="Black"/></StackPanel>
</Page>

3、DrawingVisual 对象

DrawingVisual 对象是一个轻量绘图类,用于绘制形状、图像或文本。 此类之所以为轻量类是因为它不提供布局或事件处理,从而性能得以提升。 因此,绘图非常适用于背景和剪贴画。 

4映像

WPF 图像处理大幅改进了 Windows 先前版本的图像处理功能。 显示位图或在公共控件上使用图像等图像处理功能以前主要由 Microsoft Windows 图形设备接口 (GDI) 或 Microsoft Windows GDI+ 应用程序编程接口 (API) 处理。 这些 API 提供基线图像处理功能,但缺少编解码器扩展性支持和高保真图像支持等功能。 WPF 图像处理 API 已经过重新设计,克服了 GDI 和 GDI+ 的缺点,提供一组新的 API,用于在应用程序内显示和使用图像。

使用图像时,为使性能更佳,请考虑以下建议:

  • 如果应用程序要求显示缩略图,请考虑创建一个缩略版图像。 默认情况下,WPF 会加载图像并将其解码到最大尺寸。 如果仅需要图像的缩略版本,WPF 会先将图像解码为完整尺寸,然后将其缩放为缩略图大小,这个过程是多余的。 若要避免这个多余的过程,可请求 WPF 将图像解码到缩略图大小,或者请求 WPF 加载缩略图大小的图像。

  • 请务必将图像解码到所需大小而不是默认大小。 如上所述,请求 WPF 将图像解码为所需大小而不是默认的最大尺寸。 这样不仅会减小应用程序的工作集,还会减慢其执行速度。

  • 如果可能,请将多个图像合并到单个图像中,例如由多个图像构成的胶卷条。

BitmapScalingMode

对任何位图缩放进行动画处理时,默认的高质量图像重采样算法有时可能由于消耗过多系统资源导致帧速率下降,继而导致动画明显变慢。 通过将 RenderOptions 对象的 BitmapScalingMode 属性设置为 LowQuality,缩放位图时可创建更为流畅的动画。 处理图像时,LowQuality 模式会通知 WPF 绘制引擎从质量优化算法切换至速度优化算法。

下面的示例演示如何为图像对象设置 BitmapScalingMode。

// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);

CachingHint

默认情况下,WPF 不会缓存 TileBrush 对象的绘制内容,例如 DrawingBrush 和 VisualBrush。 在静态方案中,内容和场景中 TileBrush 的使用皆不会发生改变,这样具有一定意义,因为可节省视频内存。 以非静态方式使用具有静态内容的 TileBrush 时(例如静态 DrawingBrush 或 VisualBrush 映射到旋转 3D 对象的图面时),这样做的意义不大。 WPF 的默认行为是对每个帧重新绘制 DrawingBrush 或 VisualBrush 的整个内容(即使内容未改变也是如此)。

通过将 RenderOptions 对象的 CachingHint 属性设置为 Cache,可使用缓存版平铺画笔对象来提升性能。

CacheInvalidationThresholdMinimum 和 CacheInvalidationThresholdMaximum 属性值为相对大小值,这些值决定由于比例更改而应何时重新生成 TileBrush 对象。 例如,通过将 CacheInvalidationThresholdMaximum 属性设置为 2.0,TileBrush 的缓存仅需在其大小超过当前缓存大小两倍时重新生成。

如下示例演示如何对 DrawingBrush 使用缓存提示选项。

DrawingBrush drawingBrush = new DrawingBrush();// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);// Set the minimum and maximum relative sizes for regenerating the tiled brush.
// The tiled brush will be regenerated and re-cached when its size is
// 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python——将Pyaudio的frame音频数据转换成wave格式

要将pyaudio捕获的音频帧&#xff08;frame&#xff09;数据转换成wave模块可以直接处理的格式&#xff0c;通常意味着你需要将这些音频帧数据组装成一个完整的音频流&#xff0c;并确保它们以wave模块期望的格式进行存储。但是&#xff0c;如果你的目的是将这些帧数据直接转换…

蛋氨酸市场调研:预计2029年将达到87亿美元

蛋氨酸&#xff0c;又名甲硫氨酸&#xff0c;化学名称为γ-甲硫基-a-氨基丁酸&#xff0c;是一种参与蛋白质合成的基本结构单位&#xff0c;是人体内八种必需氨基酸之一&#xff0c;同时也是重要的饲料添加剂。蛋氨酸主要用于家禽、猪的饲料添加剂以及药用等。对禽类来说&#…

adb脚本操作

用荣耀80手机测试 echo off setlocal enabledelayedexpansion adb shell am start com.android.settings timeout /t 2 /nobreak >nul adb shell input tap 500 1300 timeout /t 2 /nobreak >nul adb shell input tap 500 800 timeout /t 2 /nobreak >nul adb she…

ElasticSearch搜索与分析引擎-Linux离线环境安装教程

目录 一、下载安装包 网盘链接: 二、安装流程及遇到的问题和解决方案 &#xff08;1&#xff09;JDK安装 &#xff08;2&#xff09;Elasticsearch安装 &#xff08;3&#xff09;Kibana安装 ​&#xff08;4&#xff09;Ik分词器安装 三、启动过程中的问题 &#xff…

linux查看mysql状态重启

1.linux怎么看mysql数据库是不是宕机了&#xff1f; MySQL/MariaDB数据库的状态&#xff1a;使用systemctl status mysql或者service mysqld status命令。如果显示"active (running)"表示MySQL正常运行&#xff1b;如果显示"inactive (dead)"则表示MySQL已…

ASP.NET Core WebAPI_解决跨域问题(前端后端)

说明 我的前端框架为Vue&#xff13; 前后端跨域选其一即可 前端跨域 在项目的根目录找到vite.config.js文件&#xff0c;添加代码&#xff1a; server: {proxy: {/api: {target: https://localhost:xxxx,changeOrigin: true,secure: false},},} axios代码片段&#xff1a; …

C语言系列-联合

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 联合体 联合体类型的声明 联合体的特点 相同成员的结构体和联合体对比 联合体大小的计算 联合的一个练习 联合体 联合体类型的声明 像结构体一样&#xff0c;联合体也是由…

【Flink】FlinkSQL实现数据从MySQL到MySQL

简介 我们在实际开发过程中可以使用Flink实现数据从MySQL传输到MySQL具体操作,本例子Flink版本1.13.6,具体操作如下: 创建mysql测试表 下面语句创建了mysql原表和目标表,并插入一条语句到mysql原表中 CREATE TABLE `mysql_source` ( `id` int(11) unsigned NOT NULL A…

NLP深入学习(十二):支持向量机(SVM)

文章目录 0. 引言1. 什么是支持向量机2. 线性 SVM3. 非线性 SVM3.1 推导过程3.2 常用核函数 4. 参考 0. 引言 前情提要&#xff1a; 《NLP深入学习&#xff08;一&#xff09;&#xff1a;jieba 工具包介绍》 《NLP深入学习&#xff08;二&#xff09;&#xff1a;nltk 工具包…

C语言·贪吃蛇游戏(上)

1. 游戏任务 使用C语言在Windows环境的控制台中模拟实现小游戏贪吃蛇 游戏中要包含以下功能&#xff1a; 1. 贪吃蛇地图绘制 2. 贪吃蛇上下左右移动和吃食物 3. 蛇撞墙&#xff0c;或撞到自身死亡 4. 计算得分 5. 蛇身加速、减速 6. 暂停游戏 2. Win32 API 介绍 Windows是一种多…

云原生之可观测性-APM概念及选型

导读&#xff1a;为了让大家更好的 APM 系统的设计实现&#xff0c;我将在公众号编写《云原生之可观测性》系列文章&#xff0c;深入讲解 APM 系统的产品设计、架构设计和基础技术。APM是一个庞杂的技术体系&#xff0c;涉及到很多开源技术&#xff0c;欢迎大家留言讨论。 本文…

深入剖析Java中的反射,由浅入深,层层剥离!

写在开头 之前更新了不少Java的基础知识&#xff0c;比如Java的类、对象、基础类型、关键字、序列化、泛型、值传递等等&#xff0c;今天要上点深度了&#xff0c;来聊一聊Java中的 反射 ! 所谓反射&#xff0c;就是在运行时分析、检查和操作类、接口、方法、属性的行为&#x…

python中的异步实践与tornado应用

最近项目中由于在python3中使用tornado,之前也有用过&#xff0c;是在python2中&#xff0c;由于对于协程理解不是很透彻&#xff0c;只是套用官方文档中的写法&#xff0c;最近比较细致的看了下协程的用法&#xff0c;也将tornado在python3中异步的实践了一下。 异步基础 要…

[香橙派开发系列]使用蓝牙和手机进行信息的交换

文章目录 前言一、HC05蓝牙模块1.HC05概述2.HC05的连接图3.进入HC05的命令模式4.常用的AT指令4.1 检查AT是否上线4.2 重启模块4.3 获取软件版本号4.4 恢复默认状态4.5 获取蓝牙的名称4.6 设置蓝牙模块的波特率4.7 查询蓝牙的连接模式4.8 查询模块角色 5.连接电脑6.通过HC05发送…

2024美赛MCM Problem A: Resource Availability and Sex Ratios资源可用性和性别比例 完整代码以及思路分享

虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。例如&#xff0c;美洲短吻鳄孵化卵的巢穴的温度会影…

sql指南之null值用法

注明&#xff1a;参考文章&#xff1a; SQL避坑指南之NULL值知多少&#xff1f;_select null as-CSDN博客文章浏览阅读2.9k次&#xff0c;点赞7次&#xff0c;收藏21次。0 引言 SQL NULL&#xff08;UNKNOW&#xff09;是用来代表缺失值的术语&#xff0c;在表中的NULL值是显示…

Git解决分支合并冲突的问题:分支合并提交出现了不同分支同一个文件的修改的冲突解决

有些时候我们合并分支的时候&#xff0c;会出现冲突&#xff0c;原因就是我们修改了分支A 的第一行代码&#xff0c;我们还修改了主分支上面同一个文件中的第一行代码&#xff08;分支A已经提交过一次&#xff09;&#xff0c;此时我们在次合并的时候就会出现冲突&#xff0c;需…

智慧养老成关键力量,全视通智慧机构养老解决方案来助力

近日&#xff0c;国新办举行国务院政策例行吹风会&#xff0c;国家发展改革委、工业和信息化部、民政部、商务部有关负责人介绍《关于发展银发经济增进老年人福祉的意见》有关情况并答记者问。 会上&#xff0c;民政部养老服务司负责人李永新透露&#xff0c;将发展智慧养老服务…

tidb节点重启后,服务无法重连

大家好&#xff0c;我是烤鸭&#xff1a; 前几天遇到tidb节点重启后服务无法重连&#xff0c;确切地说是两个服务&#xff0c;一个可以正常重连&#xff0c;一个不行。 问题复现 由于线上执行慢SQL&#xff0c;导致TiDB 单个节点宕机重启。 其中A服务的3个节点和B服务的1个节…

Sketch使用手册:从入门到精通的完整教程

Sketch软件是Mac平台上流行的矢量图形编辑软件&#xff0c;旨在帮助用户创建网站、移动应用、图标等各种设计原型。Sketch软件的设计风格简洁明了&#xff0c;界面操作简单易用&#xff0c;非常适合UI/UX设计师、平面设计师等数字创意人员。本文将根据如何使用Sketch&#xff0…