1

以下のコードでは:

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

2 つの長方形の間に隙間があります。

マイクロ http://www.uploadup.com/di-0HXM.png マクロ http://www.uploadup.com/di-G1O5.png

何故ですか?

ギャップラインがはっきりしない場合は、マージンを減らすことができます。10 に設定すると、次のようになります。

マクロ、余白なし http://www.uploadup.com/di-P2ZT.png

4

1 に答える 1

1

これは、長方形の境界が整数でない場合に発生します。グラデーションは関係ありません。

考えてみてください: 右側が X=100.5 の長方形を描いていて、それを白で塗りつぶしているとします (既存の背景は黒です)。そのため、グラフィックス ライブラリ (これは GDI+ に固有のものではありません) は、右端のピクセル (X=100 の位置) を白で「半分埋め」ます。つまり、既存の黒と白の 50% の混合をブレンドして、結果を灰色にします。 .

次に、左側が X=100.5 にある別の長方形を描きます。X=100 のピクセルの半分を白で塗りつぶすと、グラフィックス ライブラリは既存の色 (グレー) を 50% の白とブレンドして、75% の白を残します。

この種の継ぎ目が必要ない場合は、(a) 長方形が少し重なるようにするか、(b) 座標を最も近いピクセルに手動で丸める必要があります。すでにあるものとの融合。

于 2012-04-18T12:05:25.190 に答える