2008-09-21 70 views
9

.NET中的LinearGradientBrush(或者甚至整个GDI +)似乎有一个严重的错误:有时,它会引入工件。 (请参阅herehere - 实质上,在endcolor中绘制线性渐变的第一行,即从白色到黑色的渐变将以黑线开始,然后以适当的白色到黑色渐变开始)LinearGradientBrush工件解决方法?

我想知道如果有人发现这个工作的解决方法?这是一个非常恼人的错误:-(

这里是文物的照片,请注意,有2个LinearGradientBrushes:

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

+0

真棒,所以现在出现先为我大部分的跆拳道搜索:) – 2009-04-06 00:06:20

+0

一直拉我的头发在这一个钟头 – Antony 2011-01-16 00:16:26

回答

9

我一直在使用渐变画笔时注意到这一点,以及唯一的有效的解决方法是始终创建渐变画笔矩形,在所有边上的边长比要绘制的区域大1个像素,这样可以保护您免受四边上的问题影响,缺点是颜色使用的颜色边缘是你指定的分数的一部分,但是这比图形伪像问题更好!

+0

对于我而言,这工作,现在文物终于走了\ O/ – 2008-09-21 03:14:00

5

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

1

至少在WPF中,您可以尝试使用GradientStops即使在重叠绘制时也能在边缘获得100%正确的颜色。

2

我想菲尔的答案在上面(这真的是一个评论,但我没有这个特权)。我看到的行为与the documentation相反,它说:

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

即在某些情况下您会得到单个像素环绕。据我所知(通过实验),当矩形的宽度或高度为奇数时,我只会遇到问题。因此,为了解决这个问题,我们发现只要尺寸(扩展前)是奇数,足以将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); 

疯狂,但却是事实。