You need to enable JavaScript to run this app. C#中Graphics.DrawRectangle与FillRectangle行为差异问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

C#中Graphics.DrawRectangle与FillRectangle行为差异问题咨询

问题原因分析

1. 尺寸异常的核心逻辑

  • GDI+中FillRectangle和DrawRectangle的绘制规则本身就存在差异:
    • FillRectangle是填充指定坐标范围内的像素区域,你传入(1,1,3,3)时,会精确填充横坐标13、纵坐标13的全部像素,总尺寸刚好3x3,符合你的预期。
    • DrawRectangle是沿指定矩形的边框绘制线条,Pen的笔触默认是居中对齐的。当你使用1像素宽的Pen绘制时,边框会占满指定矩形边界的内外各0.5像素,最终实际覆盖的像素范围会比你传入的参数宽、高各多1像素。比如你传入宽高3,最终绘制出来的边框外轮廓尺寸就是3 + 1*1 = 4x4。

2. PixelOffsetMode.Half导致的位置偏移

  • PixelOffsetMode.Half会将GDI+的坐标原点从像素的左上角偏移到像素中心,用来解决抗锯齿时的线条模糊问题。这个偏移作用在居中对齐的Pen上时,就会让本来就内外各占0.5像素的边框整体向左上偏移1像素,才会出现你看到的从(0,0)开始绘制、左上角像素缺失的表现,本质是偏移后部分边框落在了画布可视区域外。
解决方案

如果你要让DrawRectangle的绘制结果和FillRectangle完全对齐,有两种常用方案:

  • 方案1:调整绘制参数,把DrawRectangle的宽高参数减1,位置保持不变:
g.DrawRectangle(Pens.Red, 1, 1, 2, 2);

这样计算后的实际外轮廓尺寸就是2+1=3,刚好和3x3的填充矩形重合。

  • 方案2:修改Pen的对齐模式为向内对齐:
Pen pen = new Pen(Color.Red, 1);
pen.Alignment = PenAlignment.Inset;
g.DrawRectangle(pen, 1, 1, 3, 3);

设置后Pen的笔触只会向指定矩形的内部绘制,不会向外扩展,尺寸就会和FillRectangle完全一致。

内容的提问来源于stack exchange,提问作者KentGardner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 03:33:04