GDI+ 渐变效果

本文关键字:渐变 GDI+ | 更新日期: 2023-09-27 18:31:26

在下面的代码中:

void f13(Graphics g)
{
  g.FillRectangle(new SolidBrush(Color.Black), pictureBox1.ClientRectangle);
  g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  var zf = .0143;
  const int w = 6000, h = 10, margin = 40;
  var bmp = new Bitmap(w + 2 * margin, h + 2 * margin);
  var bmpG = Graphics.FromImage(bmp);
  bmpG.FillRectangle(new SolidBrush(Color.White), 0, 0, bmp.Width, bmp.Height);
  var srcRect = new RectangleF(margin - .5f, margin - .5f, w, h);
  zf = (float)Convert.ToInt32(w * zf) / w;
  var destRect = new Rectangle(0, 0, Convert.ToInt32(w * zf), Convert.ToInt32(w * zf));
  g.DrawImage(bmp, destRect, srcRect, GraphicsUnit.Pixel);
  destRect.X += destRect.Width;
  g.DrawImage(bmp, destRect, srcRect, GraphicsUnit.Pixel);
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  f13(e.Graphics);
}

我在两个矩形之间有一个间隙:

微 http://www.uploadup.com/di-0HXM.png宏 http://www.uploadup.com/di-G1O5.png

为什么?

如果缺口线不是那么清晰,您可能会减少边距。 如果将其设置为 10,您将获得:

宏观,保证金 http://www.uploadup.com/di-P2ZT.png 较少

GDI+ 渐变效果

如果矩形的边界不是整数,就会发生这种情况。渐变与它无关。

考虑一下:假设您正在绘制一个矩形,其右侧位于 X=100.5,并且您正在用白色填充它(现有背景为黑色)。因此,图形库(并非特定于 GDI+)将用白色"一半填充"最右侧的像素(X=100),这意味着它们将现有的黑色与 50% 的白色混合混合,以获得灰色的结果。

然后绘制另一个矩形,其左侧位于 X=100.5。现在,您再次用白色填充X=100处的像素,因此图形库将采用现有颜色(灰色)并将其与50%的白色混合,留下75%的白色。

如果你不想要这种接缝,你必须(a)确保你的矩形重叠一点,或者(b)手动将坐标四舍五入到最接近的像素,这样所有的像素都被完全写入,而不是与已经存在的像素混合。