.net中的LinearGradientBrush (甚至是整个GDI+中的?)似乎有一个严重的错误:有时,它引入了工件。(参见here或here -本质上,线性渐变的第一条线是在端色中绘制的,即从白到黑的渐变将从一条黑线开始,然后是正确的白到黑渐变)
我想知道是否有人找到了解决此问题的方法?这是一个非常烦人的bug :-(
以下是工件的图片,请注意这里有两个LinearGradientBrushes:
alt text http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg
发布于 2008-09-21 02:55:46
我在使用渐变笔刷时也注意到了这一点。我唯一有效的解决办法是总是创建一个渐变笔刷矩形,在所有的边缘上比要用它绘制的区域大1个像素。这可以在所有四个边缘上保护您不受问题的影响。缺点是在边缘使用的颜色比您指定的颜色要少很多,但这比绘图工件问题要好!
发布于 2008-09-21 03:05:15
您可以在矩形上使用漂亮的Inflate(int )方法来获得更大的版本。
发布于 2012-12-06 01:42:52
我会巧妙地使用上面Phil的回答(这实际上是一个评论,但我没有这个特权)。我看到的行为与the documentation相反,它说:
起始线垂直于方向线,并通过矩形的一个角。起始线上的所有点都是起始色。然后,结束线垂直于方向线,并通过矩形的一个角。结束线上的所有点都是结束颜色。
也就是说,在某些情况下,你会得到一个单像素的环绕。据我所知(通过实验),只有当矩形的宽度或高度是奇数时,我才会遇到问题。因此,为了解决这个bug,我发现当且仅当尺寸(扩展前)是奇数时,将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);很疯狂,但却是真的。
https://stackoverflow.com/questions/110081
复制相似问题