0

正如@TaW在上一个问题上所建议的那样,我设置在位PenAlignment.Inset图内绘制圆圈,但这引起了另一个问题。


我想用抗锯齿在指定的位图上画一个圆。

SmoothingMode.AntiAlias

问题是,当我使用 时PenAlignment.Inset,抗锯齿无法正常工作!
相反,PenAlignment.Center它可以正常工作......有什么
建议可以解决这个问题吗?

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

正确的抗锯齿 损坏的抗锯齿
(注意左图的错误)

4

1 回答 1

0

将边界矩形缩小 1/2 笔的笔划宽度应该可以解决这个问题。通过“放气”,我的意思是将所有 4 个边拉向矩形的中心 1/2 笔宽:

float halfPenWidth = p.Width*0.5f;
g.DrawEllipse(p, new RectangleF(halfPenWidth, halfPenWidth, layer.Width - p.Width, layer.Height - p.Width));

或插入硬编码笔宽 4:

g.DrawEllipse(p, new Rectangle(2, 2, layer.Width - 4, layer.Height - 4));

请注意,必须从矩形的宽度和高度中减去整个笔宽,以便将右侧和底部拉入 1/2 笔宽,同时保持矩形在同一点上居中。

使用此代码与笔对齐居中,笔画宽度的 1/2 将在椭圆与矩形接触的点处绘制在矩形之外,但仍将在位图内绘制。

于 2018-05-29T05:03:32.160 回答