几乎每次使用Graphics.DrawRectangle或Graphics.FillRectangle ( int版本)时,我似乎都忽略了要绘制的矩形的右边框和底部边框上的像素。
填充哪些像素的确切定义是什么?
Graphics.FillRectangle(brush,x,y,width,height)和
Graphics.DrawRectangle(pen,x,y,width,height) // pen is one pixel width, i.e. width=0f对此有合理的解释吗?(所以我终于能记起他的行为:)
编辑
使用奥列格·朱克出色的试试GDI+应用程序,我发现了FillRectangle和DrawRectangle之间的一个奇怪的区别
FillRectangle(brush,0,0,1,1)在(0,0)处画了一个点,这是可以理解的(毕竟它是一个宽度和高度为1的矩形)。
另一方面,DrawRectangle(pen,0,0,1,1)绘制一个2×2像素的小矩形。
对于其他宽度/高度组合,DrawRectangle总是向左和底部多一个像素(这有点烦人,例如当使用ClientRectangle属性在控件周围绘制帧时)。
我的第一个问题解决了(他们的行为.)还有第二个问题:他们为什么会这样做?
发布于 2011-02-12 15:48:27
这些方法工作正常,您只需考虑到抗混叠和舍入的效果。
首先,打开防混叠以查看所有内容(不仅是圆形结果):
graphics.SmoothingMode = SmoothingMode.AntiAlias;现在FillRectangle(10,10,10,10)将产生模糊结果,而DrawRectangle(10,10,10)将是锐利的。
模糊结果意味着像素坐标离开网格。如果你需要打电话:
graphics.FillRectangle(9.5f, 9.5f, 10, 10);若要在网格上对齐矩形的左上角,请执行以下操作。
DrawRectangle之所以锋利,是因为它使用宽度为1.0的钢笔。这条线从像素中心开始,在两个方向上都是0.5像素,因此正好填充了1个像素。
请注意,宽度和高度是这样计算的:
width = (right - left) = 19.5 - 9.5 = 10
height = (bottom - top) = ...注意,19.5是矩形的右/下坐标,也是在网格上对齐的,结果是一个整数。
您可以使用不同的公式:
width2 = (right - left + 1)但这只适用于圆角坐标,因为最小的单位是1像素。当使用使用反混叠的GDI+时,要注意这样一个事实,即点的大小为零,并且位于像素的中心(它不是整个像素)。
发布于 2010-06-30 17:11:18
问题中的两个Graphics方法中的矩形都由左上角的(x, y)和右下角的(x + width - 1, y + height - 1)限定。这是指定宽度和高度的结果,而不是右下角。
当您从两个点计算宽度和高度时,您必须记住通过将1添加到差值中来包括原点像素。
例如,假设您想从点(5,5)到点(10,20)填充一个矩形。矩形的宽度是6,而不是5。矩形的高度是16,而不是15。
发布于 2012-02-07 08:21:47
行为上的差异是因为这两种算法所做的事情完全不同,这一事实有点违背直觉。
DrawRectangle以一个框的形状绘制四条线。FillRectangle产生一个W*H块填充像素。从这一点可以很容易地看出行为差异的原因。即相似假设的错误。绘制四条线与产生一组象素是完全不同的。
https://stackoverflow.com/questions/3147569
复制相似问题