LinearGradientBrush工件解决方法?

.net中的LinearGradientBrush(甚至是GDI +中的整体?)似乎有一个严重的错误:有时,它会引入工件。 (参见此处或此处 – 基本上,线性渐变的第一行在endcolor中绘制,即从白色到黑色的渐变将以黑色线条开始,然后使用正确的白色到黑色渐变)

我想知道是否有人为此找到了解决方法? 这是一个非常讨厌的bug 🙁

这是Artifacts的图片,请注意有2个LinearGradientBrushes:

alt text http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

使用渐变画笔时我也注意到了这一点。 我唯一有效的解决方法是始终创建渐变画笔矩形,在所有边缘上比要用它绘制的区域大1个像素。 这可以保护您免受所有四个边缘的问题。 缺点是边缘处使用的颜色与您指定的颜色相差无几,但这比绘图工件问题更好!

您可以在矩形上使用漂亮的Inflate(int i)方法来获得更大的版本。

我会对菲尔上面的答案进行细致处理(这真的是一个评论,但我没有这个特权)。 我看到的行为与文档相反,后者说:

起始线垂直于方向线并穿过矩形的一个角。 起始线上的所有点都是起始颜色。 然后结束线垂直于方向线并穿过矩形的一个角。 结束行上的所有点都是结束颜色。

也就是说,在某些情况下,您可以获得单个像素环绕。 据我所知(通过实验)我只有在矩形的宽度或高度为奇数时才会出现问题。 因此,为了解决这个问题,我发现当且仅当维度(扩展前)是奇数时,将LinearGradientBrush矩形增加1个像素就足够了。 换句话说,始终将画笔矩形向上舍入到宽度和高度中的下一个偶数个像素。

所以要填充一个矩形r我使用类似的东西:

 Rectangle gradientRect = r; if (r.Width % 2 == 1) { gradientRect.Width += 1; } if (r.Height % 2 == 1) { gradientRect.Height += 1; } var lgb = new LinearGradientBrush(gradientRect, startCol, endCol, angle); graphics.FillRectangle(lgb, r); 

疯了但是真的。

至少在WPF中,您可以尝试使用GradientStop在边缘处获得100%正确的颜色,即使在重绘时也是如此。