【问题标题】:DrawEllipse: Ellipse goes outside of the Bitmap sizeDrawEllipse:椭圆超出位图大小
【发布时间】:2018-11-07 12:35:39
【问题描述】:

我想在指定的Bitmap 上绘制一个带有DrawEllipse 的圆,与位图的大小相同,但结果是圆在边缘处出现了剪裁。
为什么会出现这个问题?

Bitmap layer = new Bitmap(80, 80);
using (Graphics g = Graphics.FromImage(layer))
{
    using (Pen p = new Pen(Color.Black, 4))
    {
        g.DrawEllipse(p, new Rectangle(0, 0, layer.Width, layer.Height));
    }
}
pictureBox3.Size = new Size(100, 100);
pictureBox3.Image = layer;

【问题讨论】:

    标签: c# winforms graphics bitmap drawellipse


    【解决方案1】:

    默认情况下,笔具有PenAlignment.Center

    这意味着它的一半宽度将绘制在边界矩形之外。

    您可以通过将其更改为PenAlignment.Inset 来避免此问题:

    using (Pen p = new Pen(Color.Black, 4) { Alignment = PenAlignment.Inset})
    {
        g.DrawEllipse(p, new Rectangle(0, 0, layer.Width, layer.Height));
    }
    

    更新:如果您想为 Graphics 对象启用平滑处理,您需要在笔触两侧额外增加 1 或 2 个像素以用于抗锯齿像素。现在无法避免使用较小的边界矩形。但是..:

    Rectangle rect = new Rectangle(Point.Empty, layer.Size);
    rect.Inflate(-1, -1);  // or -2
    

    ..应该做..

    【讨论】:

    • 它可以工作,但会导致抗锯齿模式出现问题:stackoverflow.com/q/50575461/3605220
    • 没错,抗锯齿确实需要一个额外的像素(在笔触的两侧)。我所知道的没有简单的解决方法,除了让形状少一个像素的高和宽。考虑到旧的difference,例如DrawRectangle 和 FillRectangle..
    • 我发现PenInset 对齐产生的结果比Center 对齐差很多。我将这种减少用于Rectangle.Inflate() 方法:Rectangle.Inflate((int)(-(Pen.Width / 2) - 1), (int)(-(Pen.Width / 2)) - 1); 它适用于将SmoothingMode 设置为AntiAliasHighQuality。如果没有抗锯齿,则不需要 -1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2021-06-09
    • 1970-01-01
    • 2012-08-19
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多