C# LinearGradientBrush的怪异行为

C# LinearGradientBrush的怪异行为,c#,winforms,system.drawing,brush,lineargradientbrush,C#,Winforms,System.drawing,Brush,Lineargradientbrush,我想用LinearGradientBrush填充一个矩形。用一些矩形,我会有一些奇怪的行为。例如: Rectangle rect = new Rectangle( 20, 20, 20, 34 ); LinearGradientMode mode = LinearGradientMode.Vertical; Brush brush = new LinearGradientBrush( rect, Color.White, Color.Blue, mode ); e.Graphics.FillRe

我想用LinearGradientBrush填充一个矩形。用一些矩形,我会有一些奇怪的行为。例如:

Rectangle rect = new Rectangle( 20, 20, 20, 34 );
LinearGradientMode mode = LinearGradientMode.Vertical;
Brush brush = new LinearGradientBrush( rect, Color.White, Color.Blue, mode );
e.Graphics.FillRectangle( brush, rect );
大多数矩形都可以工作,但在这种情况下,一些类似上面的矩形会用第二种颜色蓝色填充第一个像素行。 见附图:


有什么想法吗?

让画笔高出一个像素:

LinearGradientMode mode = LinearGradientMode.Vertical;
Rectangle BrushRect = rect;
BrushRect.Inflate(0, 1);
Brush brush = new LinearGradientBrush(BrushRect, Color.White, Color.Blue, mode);

使笔刷高出一个像素:

LinearGradientMode mode = LinearGradientMode.Vertical;
Rectangle BrushRect = rect;
BrushRect.Inflate(0, 1);
Brush brush = new LinearGradientBrush(BrushRect, Color.White, Color.Blue, mode);

问题是填充的MS实现中的错误:
当你们认为你们使用画笔并应用于某个点X,Y时,MS从另一侧工作:他们使用Y偏移量,并从画笔高度的除法中计算余数。该提醒将在画笔内偏移以获取颜色。换句话说,您绘制的画布将使用笔刷以绝对偏移0平铺。所以,若你们在Y=7的位置绘制渐变,那个么渐变的颜色也会从偏移7的笔刷中获取,而不是0

问题在于MS实施Fill时的错误:
当你们认为你们使用画笔并应用于某个点X,Y时,MS从另一侧工作:他们使用Y偏移量,并从画笔高度的除法中计算余数。该提醒将在画笔内偏移以获取颜色。换句话说,您绘制的画布将使用笔刷以绝对偏移0平铺。所以,若你们在Y=7的位置绘制渐变,那个么渐变的颜色也会从偏移7的笔刷中获取,而不是0

好主意。这就解决了问题。但你知道为什么会这样吗?好主意。这就解决了问题。但是你知道为什么会这样吗?一个更晚更好的答案被贴在了这里一个更晚更好的答案被贴在了这里