WPF绘制矢量图形模糊的问题

WPF默认提供了抗锯齿功能,通过向外扩展的半透明边缘来实现模糊化。由于WPF采用了设备无关单位,当设备DPI大于系统DPI时,可能会产生像素自动扩展问题,这就导致线条自动向外扩展一个像素,并且与边缘相邻的线条颜色变成了半透明,如下图所示:

这种特性在绘制细线条的时候会导致一些我们所不期望的结果:颜色变淡,线条模糊,线条变粗。很多时候,我们是无法绘制一个像素的清晰的线条的。对于这个问题,WPF给我们提供了几种解决方案:

1、设置像素对齐

对于系统内置的一些控件,通过设置SnapsToDevicePixels为true,可以非常方便的实现像素对齐。

这个属性是有继承效果的,只要在父控件上设置了,其所有的子控件都是生效的。但它有时会出现改变窗口大小时线条消失的情况

2、设置对齐参考线

方法1只针对系统的内置的一些控件有效,但对于使用DrawingVisual等方式自绘的图形则没有效果。此时可以通过设置参考线解决这一问题。

具体代码参见MSDN:Apply a GuidelineSet to a Drawing

3、设置 RenderOptions.EdgeMode="Aliased"

前面的设置参考线方式效果较好,不过需要编写较多的代码,并且只能适用于水平或垂直的线条。很多时候,我使用的是设置 RenderOptions.EdgeMode="Aliased"(如果在代码中则是使用this.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased)),

4、设置UseLayoutRounding="True"

这个是在WPF4后增加的一个选项,用来控制布局舍入的,用来控制图片模糊的效果非常好,用于控制控件的模糊效果也不错的。不过也是对DrawingContext绘制的图形没有效果的。

小结:WPF的抗锯齿效果在给我们带来的很好的视觉效果的同时,也给我们带来的不少困扰,本文就总结了几种常见的解决方案,希望能对大家的工作带来一点帮助。

时间: 2024-09-29 09:24:34

WPF绘制矢量图形模糊的问题的相关文章

[转] C#中绘制矢量图形

无涯 原文 C# 绘制矢量图形 [原创] 近来参与了一个项目,软件主要的功能就是使用C#画矢量图,然后导出到Word.Excel.Powerpoint中,并且能够再次被编辑.以下是我们的解决过程: 首先应该确定在Office文档中可编辑图形使用的格式:学习了相关资料,了解到Office文档主要支持三种矢量图的格式:1.VML图形,2.WMF 文件格式,3.EMF文件格式.由于VML图开一般使用HTML语言进行描述,不便于进行操作,因此决定采用WMF和EMF文件格式. 接下来的工作就是要让C#根据

WPF绘制折线

WPF后台绘制折线,填充到一个GRID下 private void btnPreview_Click(object sender, RoutedEventArgs e) { GridImg.Children.Clear(); System.Drawing.Point p0 = new System.Drawing.Point(0, 0); System.Drawing.Point p1 = new System.Drawing.Point(0, 0); System.Drawing.Point

H5 canvas绘制出现模糊的问题

在之前做移动端小游戏幸运转盘.九宫格转盘,使用到了 canvas ,也是第一次在项目中使用 canvas 来实现. 近期测试人员反应 canvas 绘制的内容太模糊,心想着用 canvas 绘制出来的怎么会模糊,先前也有考虑到适配不同尺寸的移动设备,担心直接使用 img 或者设置 background 会使图片拉伸而变得模糊,所以使用 canvas 来绘制转盘与九宫格,精确的计算每个物体所在的坐标以及尺寸绘制出来的,怎么会模糊. 然而将绘制的内容与页面中的其他文字或者图片作对比后,发现使用 ca

Canvas绘制线条模糊的解决方案

前段时间,做一个跨平台app项目,需要绘制分时图和K线图.找了很多开源的js的图表库,包括echarts.highcharts等等,都不是很满意,原因有2: 1.太臃肿,我实际上只要一个分时和一个K线图表,最多搭配几个线形图 2.不满足需求.主要就是分时图,国内玩的js图表库,几乎都没有分时图.都是用1分钟线的收盘价线来做的,和中国股民的使用习惯完全不搭界. 多年前有人开源了一个js绘制股票图形的库,叫做html54stock,图像表现上很符合中国人的使用习惯,但是也有问题: 1.封装不好,很多

WPF绘制简单常用的Path(转)

写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比较喜欢用代码 因为数值控制的更精细 MSDN告诉我们,Path可以用这些形状绘制: ArcSegment 类 表示两点之间的一条椭圆弧. BezierSegment 类 表示在两个点之间绘制的一条三次贝塞尔曲线. LineSegment 类 在PathFigure中的两个点之间创建一条直线. PolyBezierSegment 类 表

在WPF中绘制多维数据集

原文 https://stuff.seans.com/2008/08/13/drawing-a-cube-in-wpf/ 是时候使用WPF绘制一个简单的3D对象了.作为WPF中3D图形的快速介绍,让我们只渲染一个最简单的对象 - 一个立方体. 在这个例子中,我将直接在XAML中定义我们需要的所有内容.与WPF中的其他内容一样,我们可以直接在代码中完成所有这些操作.但是在XAML中定义所有内容更加清晰,因为它使对象层次结构更加明显.在实际项目中,您显然会在代码中执行此操作,例如创建或加载3D网格(

关于WPF的2000件事 05--矢量图形和呈现与分辨率无关

在WPF中,渲染东西使用的是矢量图,而不是位图,包括你创建的用户自定义控件也不是像位图一样一个一个像素在屏幕上绘制,而是使用最基本的图形元素如形状.线.多边形. 因为WPF使用矢量图形,所以WPF的用户界面将与分辨率无关.这导致用户界面总是能呈现指定的大小不管设备的分辨率是多少. 国外的文章:https://wpf.2000things.com/index/ 试着翻译,全当练习英语,理解错的地方可能很多,别信我..

2000条你应知的WPF小姿势 基础篇<1-7>

在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF .听到博客名字就懂这个人有多伟大了吧.他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的博客也有一段日子了,很希望能够分享给大家. 本系列我不仅会翻译

在 WPF 程序中应用 Windows 10 真?亚克力效果

原文:在 WPF 程序中应用 Windows 10 真?亚克力效果 从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了.不过相比于 UWP 来说,可定制性会差很多. 本文介绍如何在 WPF 程序中应用 Windows 10 真?亚克力效果.(而不是一些流行的项目里面自己绘制的亚克力效果.) 本文内容 API 如何使用 注意事项 API 需要使用的 API 是微软的文档中并未公开的 SetWindowCompositionAttribute.