代码之家  ›  专栏  ›  技术社区  ›  MartinStettner

FillRectangle和DrawRectangle的像素行为

  •  12
  • MartinStettner  · 技术社区  · 15 年前

    几乎每次我用 Graphics.DrawRectangle Graphics.FillRectangle (the) int 版本)我似乎错过了像素的权利和底部边界的矩形,我想画。

    像素填充的确切定义是什么

    Graphics.FillRectangle(brush,x,y,width,height)
    

    Graphics.DrawRectangle(pen,x,y,width,height) // pen is one pixel width, i.e. width=0f
    

    有没有合理的解释(所以我终于能记得当时的行为:)…)

    编辑 :

    用朱立群的妙笔 Try GDI+ 在应用程序中,我发现 FillRectangle DrawRectangle :

    FillRectangle(brush,0,0,1,1)

    DrawRectangle(pen,0,0,1,1) 另一方面,绘制一个2×2像素的小矩形。

    绘图矩形 总是向左侧和底部多延伸一个像素(这有点烦人,例如在使用 ClientRectangle

    我的第一个问题解决了( 怎样 为什么? 他们这样做吗?

    3 回复  |  直到 15 年前
        1
  •  9
  •   Libor    14 年前

    这些方法工作正常,您只需考虑 消除混叠和舍入 .

    首先,启用“抗锯齿”(anti-aliasing)以查看所有内容(而不仅仅是取整的结果):

    graphics.SmoothingMode = SmoothingMode.AntiAlias;
    

    现在FillRectangle(10,10,10,10)将产生模糊的结果,DrawRectangle(10,10,10,10)将是尖锐的。

    模糊的结果意味着 . 如果您需要打电话:

    graphics.FillRectangle(9.5f, 9.5f, 10, 10);
    

    对齐网格上矩形的左上角。

    width = (right - left) = 19.5 - 9.5 = 10
    height = (bottom - top) = ...
    

    width2 = (right - left + 1)
    

    仅圆坐标 ,因为最小单位是1像素。在使用使用抗锯齿的GDI+时,请注意点的大小为零并且不存在 在像素中心 (不是整个像素)。

        2
  •  1
  •   Gilbert Le Blanc    15 年前

    问题中两种图形方法中的矩形都以 (x, y) 在左上角和 (x + width - 1, y + height - 1) 在右下角。这是指定宽度和高度的结果,而不是右下角的点。

    在计算两点的宽度和高度时,请记住将原点像素与差加1。

    例如,假设要填充从点(5,5)到点(10,20)的矩形。矩形的宽度是6,而不是5。矩形的高度是16,而不是15。

        3
  •  -2
  •   Tatarize    13 年前

    行为上的差异是由于这两种算法所做的事情完全不同,这有点违反直觉。

    DrawRectangle以长方体的形状绘制四条线。FillRectangle生成一个W*H的填充像素束。从这一点很容易看出行为差异的原因。即相似性假设的错误性。绘制四条线与生成一个长方体像素团有很大的不同。

    推荐文章