【问题标题】:GDI+ gradient effectGDI+渐变效果
【发布时间】:2012-04-29 18:34:49
【问题描述】:

在下面的代码中:

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);
}

我得到两个矩形之间的间隙:

micro http://www.uploadup.com/di-0HXM.png macro http://www.uploadup.com/di-G1O5.png

这是为什么呢?

如果差距线不是很清楚,您可以减少边距。如果你将它设置为 10,你会得到:

macro, less margin http://www.uploadup.com/di-P2ZT.png

【问题讨论】:

  • 添加 g.PixelOffsetMode = PixelOffsetMode.Half; 以便浮点舍入错误不会字节。
  • 感谢 Hans,这将 margin 的值降低到 9。现在即使是 8 也会出现差距。我仍然可以解释这一点,但无法弄清楚 PixelOffsetMode 是什么。你能解释更多吗?
  • 我还评论了设置插值模式的行,这导致必须增加边距。使用默认插值模式,边距必须至少为 18。GDI+ 中发生了什么,我如何在其中找到自己的方式?

标签: c# gdi+


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复。考虑只画一个矩形。如果我绘制它以使其不会产生任何灰度,因此绘制两个矩形不会产生间隙效果,对吗?所以让我们将问题简化为:我如何从它的源矩形绘制图像,该图像与目标矩形不完整,这样就不会出现灰度效果?正如文森特告知here (0, 0) 的源图像定义在我们称之为 (.5, .5) 的位置。所以图像从(-.5,-.5)开始。当我将边距定义为...时,我希望在上面的代码中...
  • ... 一个像素,从 (.5, .5) 开始我的源矩形,源矩形周围的一个像素足以忽略灰色效果。换句话说,我并没有从源图像边缘开始我的源矩形。实际上,它周围有一个像素边距,颜色相同(白色)。当我看到这一个像素不够时,我增加了它。但我看到我必须使用厚边距才足够。那是什么?这是我的问题。
  • 关于您的建议:我不想重叠它们。此外,我不知道它们必须重叠多少才足够。湾。源矩形不能处于整数边界。考虑当我选择 2x2 形状并希望在 3000x3000 像素的客户区域中滚动它时。
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2016-10-06
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多