首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinearGradientBrush工件解决方案?

LinearGradientBrush工件解决方案?
EN

Stack Overflow用户
提问于 2008-09-21 02:45:23
回答 5查看 1.8K关注 0票数 9

.net中的LinearGradientBrush (甚至是整个GDI+中的?)似乎有一个严重的错误:有时,它引入了工件。(参见herehere -本质上,线性渐变的第一条线是在端色中绘制的,即从白到黑的渐变将从一条黑线开始,然后是正确的白到黑渐变)

我想知道是否有人找到了解决此问题的方法?这是一个非常烦人的bug :-(

以下是工件的图片,请注意这里有两个LinearGradientBrushes:

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-09-21 02:55:46

我在使用渐变笔刷时也注意到了这一点。我唯一有效的解决办法是总是创建一个渐变笔刷矩形,在所有的边缘上比要用它绘制的区域大1个像素。这可以在所有四个边缘上保护您不受问题的影响。缺点是在边缘使用的颜色比您指定的颜色要少很多,但这比绘图工件问题要好!

票数 9
EN

Stack Overflow用户

发布于 2008-09-21 03:05:15

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

票数 5
EN

Stack Overflow用户

发布于 2012-12-06 01:42:52

我会巧妙地使用上面Phil的回答(这实际上是一个评论,但我没有这个特权)。我看到的行为与the documentation相反,它说:

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

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

因此,为了填充一个矩形r,我使用如下内容:

代码语言:javascript
复制
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);

很疯狂,但却是真的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/110081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档