【问题标题】:How can I get rid of these 'spike' visual artifacts when drawing with WPF?使用 WPF 绘图时如何摆脱这些“尖峰”视觉伪影?
【发布时间】:2012-09-20 11:39:28
【问题描述】:

我目前正在为地图应用绘制一些图块(小方形图像)。

我正在使用 WPF 在这些图块上绘制形状。

我有一个地理空间坐标列表,这些坐标组成了所绘制的多边形。

构成这些多边形的地理空间坐标被转换为像素坐标。

瓷砖是在不同的细节层次上创建的。

在大多数这些细节层次上,绘图都很好;但在某些级别,视觉伪影会以尖峰或线条的形式出现。

这是一个示例,这些图像具有三个不同的细节级别,一个显示问题,两个显示问题没有发生的两侧。

这张图细节度最高,还可以:

这张图片是中等细节级别的,并且有尖刺(85 号公路上最容易发现):

此图像的细节级别最低,还可以:

当多边形中的两条线彼此靠近和/或形成一个密集点(收敛)时,就会出现尖峰。

我们已经检查了源数据并且这些工件不存在(这也可以通过它在大多数时间正确呈现的事实得到证实)。

下一个怀疑是坐标转换过程,但我们再次检查它,生成的点不应该以这种方式绘制。

这让 WPF 成为让我们陷入困境的罪魁祸首,因为我们无法像使用自己的代码那样简单地解决问题。

你们以前见过这种东西吗?

修复会很棒;)

目前看来,我们要么不得不忍受这个问题,要么改用 Direct2D。我们已经放弃了 GDI+ 渲染,因为它在一个进程中是单线程的。

【问题讨论】:

  • 绘图代码是什么样的?使用绘图上下文?我们可以看看一些代码吗?
  • 尝试使用 Pen 的 MiterLimit 属性,或将 Pen 的 LineJoin 属性更改为 Round。
  • 嗨,莫哲。那解决了它!你能把这个作为答案留下来让我接受吗?
  • @AndyJ 由于 Moozhe 已经超过 15 天没有添加他的修复作为答案,您不妨自己添加答案并将其标记为已回答。如果你不这样做,我会的,只是为了保持未回答队列的清洁。

标签: wpf drawing visual-artifacts


【解决方案1】:

解决方案是将 Pen 对象的 LineJoin 属性更改为“Round”。

http://msdn.microsoft.com/en-us/library/system.windows.media.pen.linejoin.aspx

http://msdn.microsoft.com/en-us/library/system.windows.media.penlinejoin.aspx

非常感谢在 cmets 中提供此答案的 Moozhe。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2016-11-17
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多