LinearGradientBrush工件解决方法?
.NET中的LinearGradientBrush(或者甚至整个GDI +)似乎有一个严重的错误:有时,它会引入工件。 (请参阅here或here - 实质上,在endcolor中绘制线性渐变的第一行,即从白色到黑色的渐变将以黑线开始,然后以适当的白色到黑色渐变开始)LinearGradientBrush工件解决方法?
我想知道如果有人发现这个工作的解决方法?这是一个非常恼人的错误:-(
这里是文物的照片,请注意,有2个LinearGradientBrushes:
alt text http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg
我一直在使用渐变画笔时注意到这一点,以及唯一的有效的解决方法是始终创建渐变画笔矩形,在所有边上的边长比要绘制的区域大1个像素,这样可以保护您免受四边上的问题影响,缺点是颜色使用的颜色边缘是你指定的分数的一部分,但是这比图形伪像问题更好!
对于我而言,这工作,现在文物终于走了\ O/ – 2008-09-21 03:14:00
你可以在矩形上使用漂亮的Inflate(int i)方法来获得更大的版本。
至少在WPF中,您可以尝试使用GradientStop
s即使在重叠绘制时也能在边缘获得100%正确的颜色。
我想菲尔的答案在上面(这真的是一个评论,但我没有这个特权)。我看到的行为与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);
疯狂,但却是事实。
真棒,所以现在出现先为我大部分的跆拳道搜索:) – 2009-04-06 00:06:20
一直拉我的头发在这一个钟头 – Antony 2011-01-16 00:16:26