C# GDI+;梯度效应

C# GDI+;梯度效应,c#,gdi+,C#,Gdi+,在下面的代码中: 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 Bi

在下面的代码中:

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);
}
我得到两个矩形之间的间隙:

为什么呢

如果间隙线不太清晰,可以减小余量。如果将其设置为10,您将得到:


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

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

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


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

如果你的矩形边界不是整数,就会发生这种情况。梯度与此无关

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

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


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

添加
g.PixelOffsetMode=PixelOffsetMode.Half
因此浮点舍入错误不包含字节。感谢Hans,这将边距值减少到9。现在即使是8,差距也出现了。我仍然可以解释这一点,但不知道什么是PixelOffsetMode。你能解释一下吗?我还对设置插值模式的线条进行了注释,这导致了边距必须增加。使用默认插值模式时,边距必须至少为18。GDI+中发生了什么,我如何在其中找到自己的路?添加
g.PixelOffsetMode=PixelOffsetMode.Half
因此浮点舍入错误不包含字节。感谢Hans,这将边距值减少到9。现在即使是8,差距也出现了。我仍然可以解释这一点,但不知道什么是PixelOffsetMode。你能解释一下吗?我还对设置插值模式的线条进行了注释,这导致了边距必须增加。使用默认插值模式时,边距必须至少为18。GDI+中发生了什么?我如何在其中找到自己的方法?感谢您的回复。考虑只绘制一个矩形。如果我画它,它不会产生任何灰度,所以画两个矩形不会产生间隙效果,对吗?让我们把问题简化为:如何从一个源矩形中画出一个图像,这个源矩形与一个目标矩形是不可积分的,这样就不会出现灰度效果?正如Vincent告知的(0,0),源图像定义在我们调用它的地方(.5,.5)。因此,图像从(-.5,-.5)开始。当我将边距定义为。。。。。。一个像素,从(.5,.5)开始,围绕源矩形的一个像素足以忽略灰色效果。换句话说,我并不是从源图像的边缘开始创建源矩形。事实上,它周围有一个像素的空白,颜色相同(白色)。当我看到这一个像素是不够的,我增加了它。但我明白,我必须用一个厚厚的页边空白。那是什么?这是我的问题。关于你的建议:a。我不想把它们重叠起来。此外,我不知道它们必须重叠多少才能足够。B源矩形不能位于整数边界处。当我选择一个2x2形状,并想滚动它在3000 0x3000像素客户端区域。谢谢回复。考虑只绘制一个矩形。如果我画它,它不会产生任何灰度,所以画两个矩形不会产生间隙效果,对吗?让我们把问题简化为:如何从一个源矩形中画出一个图像,这个源矩形与一个目标矩形是不可积分的,这样就不会出现灰度效果?正如Vincent告知的(0,0),源图像定义在我们调用它的地方(.5,.5)。因此,图像从(-.5,-.5)开始。当我将边距定义为。。。。。。一个像素,从(.5,.5)开始,围绕源矩形的一个像素足以忽略灰色效果。换句话说,我并不是从源图像的边缘开始创建源矩形。事实上,它周围有一个像素的空白,颜色相同(白色)。当我看到这一个像素是不够的,我增加了它。但我明白,我必须用一个厚厚的页边空白。那是什么?这是我的问题。关于你的建议:a。我不想把它们重叠起来。此外,我不知道它们必须重叠多少才能足够。B源矩形不能位于整数边界处。考虑当我选择2x2形状,并希望滚动它在3000 0x3000像素的客户端区域。