【问题标题】:Silverlight - Brush bandingSilverlight - 刷带
【发布时间】:2012-10-04 00:38:28
【问题描述】:

谁能告诉我如何增加 Silverlight 渐变画笔上“色带”的数量?

这个问题被标记为下面的回答,但它确实不是使用位图而不是渐变画笔的解决方案,因为我的用户可以动态修改他们的背景。这在使用全屏渐变时最为明显。

how to make the brush smooth without lines in the middle

【问题讨论】:

    标签: silverlight brush


    【解决方案1】:

    很遗憾,我只能给你一半的答案——关于为什么会发生这种情况以及如何避免这种情况的一般原则。至于在SL中的实现,我只能给你一些大概的想法,因为我不是那里的专家。

    这些色带是由显示器的有限颜色深度造成的。为了减少效果,必须使渐变稍微嘈杂。最简单的方法是将渐变中的颜色计算为浮点数,然后以加权、随机的方式将其四舍五入为整数 - 如下所示:

    correct_value = linear_gradient(x,y)     // e.g 25.3
    whole_part = round_down(correct_value)   // 25
    frac_part = correct_value - whole_part   // 0.3
    color_used = whole_part
    if (true_with_probability(frac_part)):
      color_used = color_used + 1            // color_used == 25 with 70% chance
                                             //               26 with 30% chance
    

    这里是一个使用这种技术的例子(左边是简单四舍五入到最接近的整数的效果,右边是带噪声的四舍五入):

    至于如何在您的情况下实现它 - 我假设有某种方法可以创建自定义 Brush 对象,该对象将允许您进行每个像素的计算,或者某种可以提供帮助的着色器功能。如果这些都不可能,您也可以使用此逻辑简单地生成位图,并将该位图用作画笔(​​我相信这将是 ImageBrush,但这只是来自谷歌搜索)。

    也许有更多 Silverlight 知识的人可以加入并在这种情况下提供最佳实施。

    【讨论】:

    • 感谢您的快速回复。并且相信这确实是 Silverlight 特定的问题,就好像我使用在 Photoshop 中创建的位图作为背景一样,它可以完美显示。此外,如果我添加额外的渐变停止,问题会减少,因为渐变停止之间似乎有固定数量的带(似乎约为 70)。我可以在代码中添加这些,但这是不应该做的额外工作。有没有办法将梯度停止之间的波段数加倍,因为 70 在大型显示器上非常明显。
    • 抱歉,波段的数量似乎会根据渐变色标之间的实际色差而有所不同...
    • 完全正确 - 差异越小,色带越宽(在停靠点之间使用的实际颜色越少)。与默认的 Silverlight 相比,Photoshop 具有更好的绘制渐变算法(很可能比我在此处描述的简单解决方案要好得多)。
    • 有道理,渐变中的颜色越接近,条带就越明显。所以我想答案是这就是 SL 的工作方式?