首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FillRectangle和DrawRectangle的像素行为

FillRectangle和DrawRectangle的像素行为
EN

Stack Overflow用户
提问于 2010-06-30 08:28:11
回答 3查看 10K关注 0票数 14

几乎每次使用Graphics.DrawRectangleGraphics.FillRectangle ( int版本)时,我似乎都忽略了要绘制的矩形的右边框和底部边框上的像素。

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

代码语言:javascript
运行
复制
Graphics.FillRectangle(brush,x,y,width,height)

代码语言:javascript
运行
复制
Graphics.DrawRectangle(pen,x,y,width,height) // pen is one pixel width, i.e. width=0f

对此有合理的解释吗?(所以我终于能记起他的行为:)

编辑

使用奥列格·朱克出色的试试GDI+应用程序,我发现了FillRectangleDrawRectangle之间的一个奇怪的区别

FillRectangle(brush,0,0,1,1)在(0,0)处画了一个点,这是可以理解的(毕竟它是一个宽度和高度为1的矩形)。

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

对于其他宽度/高度组合,DrawRectangle总是向左和底部多一个像素(这有点烦人,例如当使用ClientRectangle属性在控件周围绘制帧时)。

我的第一个问题解决了(他们的行为.)还有第二个问题:他们为什么会这样做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-12 15:48:27

这些方法工作正常,您只需考虑到抗混叠和舍入的效果。

首先,打开防混叠以查看所有内容(不仅是圆形结果):

代码语言:javascript
运行
复制
graphics.SmoothingMode = SmoothingMode.AntiAlias;

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

模糊结果意味着像素坐标离开网格。如果你需要打电话:

代码语言:javascript
运行
复制
graphics.FillRectangle(9.5f, 9.5f, 10, 10);

若要在网格上对齐矩形的左上角,请执行以下操作。

DrawRectangle之所以锋利,是因为它使用宽度为1.0的钢笔。这条线从像素中心开始,在两个方向上都是0.5像素,因此正好填充了1个像素。

请注意,宽度和高度是这样计算的:

代码语言:javascript
运行
复制
width = (right - left) = 19.5 - 9.5 = 10
height = (bottom - top) = ...

注意,19.5是矩形的右/下坐标,也是在网格上对齐的,结果是一个整数。

您可以使用不同的公式:

代码语言:javascript
运行
复制
width2 = (right - left + 1)

但这只适用于圆角坐标,因为最小的单位是1像素。当使用使用反混叠的GDI+时,要注意这样一个事实,即点的大小为零,并且位于像素的中心(它不是整个像素)。

票数 9
EN

Stack Overflow用户

发布于 2010-06-30 17:11:18

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

当您从两个点计算宽度和高度时,您必须记住通过将1添加到差值中来包括原点像素。

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

票数 1
EN

Stack Overflow用户

发布于 2012-02-07 08:21:47

行为上的差异是因为这两种算法所做的事情完全不同,这一事实有点违背直觉。

DrawRectangle以一个框的形状绘制四条线。FillRectangle产生一个W*H块填充像素。从这一点可以很容易地看出行为差异的原因。即相似假设的错误。绘制四条线与产生一组象素是完全不同的。

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

https://stackoverflow.com/questions/3147569

复制
相关文章

相似问题

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