首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDI+渐变效果

GDI+渐变效果
EN

Stack Overflow用户
提问于 2012-04-18 18:50:20
回答 1查看 485关注 0票数 1

在以下代码中:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2012-04-18 20:05:25

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10207859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档