1

我一直看到分数笔宽度的一些奇怪行为,我想知道是否有人可以解释发生了什么。在表单上绘制一个矩形以响应 Paint 事件:

private void Form1_Paint(object sender, PaintEventArgs e)
{
  const float width = 1.996093F;
  Rectangle rectangle = new Rectangle(10, 10, 20, 20);

  using (Pen pen = new Pen(Color.Black, width))
  {
    e.Graphics.DrawRectangle(pen, rectangle);
  }
}

宽度在 0 到 1.996093 之间,我得到一个 1 像素宽的矩形。宽度在 1.996094 和 2.003906 之间,我得到一个 2 像素宽的矩形;从 2.003907 到 3.996093 我得到 3 个像素,依此类推。更奇怪的是,在宽度为 1.9960937 的情况下,我得到了一个矩形,其顶部边缘宽 2 个像素,其他边缘宽 1 个像素。

谁能解释这里发生了什么?我有点希望分界点是 1.5、2.5、3.5 等。

4

1 回答 1

0

我认为,当您为正在绘制的 Graphics 对象启用抗锯齿功能时,您应该会看到问题消失了。

问题是一个永恒的问题:当你得到部分绘制的像素时,它们是黑色还是白色?结果取决于算法和猜测。

虽然我想知道为什么当你真正想要清晰的一或两个像素宽的线条时,你为什么要使用分数像素宽度。您可以轻松地将宽度四舍五入为整数,并且不会再看到任何类似的问题。

于 2009-10-29T10:08:03.810 回答