GDI+ .NET:线性渐变画刷宽度超过202像素会导致颜色环绕。

6

如果我用LinearGradientBrush来绘制一个宽度大于202像素的矩形,左侧会出现颜色晕染:

enter image description here

以下是一个宽度为202像素的矩形的代码:

private void MainForm_Paint(object sender, PaintEventArgs e)
{
   Rectangle r = new Rectangle(50, 50, 202, 50);

   Color color1 = Color.FromArgb(unchecked((int)0xFF00024d));
   Color color2 = Color.FromArgb(unchecked((int)0xFFd6a20f));

   Brush b = new LinearGradientBrush(r, color1, color2, LinearGradientMode.Horizontal);
   e.Graphics.FillRectangle(b, r);
}

我得到了一个正确绘制的矩形:

在此输入图像描述

但如果我将矩形宽度更改为203像素:

Rectangle r = new Rectangle(50, 50, 203, 50);

矩形左侧有彩色边缘或环绕: enter image description here 垂直方向上也会出现带有LinearGradientMode.Vertical的情况:
202px: enter image description here 203px: enter image description here

这里也可以复现。看起来像是一个 bug。 - Albin Sunnanbo
ILSpy只是告诉我所有有趣的事情似乎都在gdiplus.dll内部发生。 - Albin Sunnanbo
1
这是提醒您接受满意的答案。您非常熟悉该网站,所以这可能被忽略了。 - Muhammad Alkarouri
1个回答

11
在调用 FillRectangle() 方法之前添加此语句:
 e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;

这可以避免由于浮点数舍入误差导致的偏移一问题。


这个完美运作。根据文档(“指定像素沿水平和垂直方向偏移-.5单位”)我担心像素可能会偏移-.5单位。幸运的是,PixelOffsetMode.Half不会将像素偏移一半,所有内容都呈现正常。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接