DrawEllipse: сглаживание не работает с PenAlignment.Inset

Как предложено @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;

правильное сглаживание сломанный сглаживание
(Обратите внимание на ошибки на левом изображении)

1 ответ

Сдувание ограничивающего прямоугольника на 1/2 ширины хода пера должно решить эту проблему. Под "выкачиванием" я подразумеваю тягу со всех четырех сторон к центру прямоугольника на 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 ширины пера, сохраняя при этом прямоугольник по центру в одной и той же точке.

Используя этот код с центрированием выравнивания пера, половина ширины обводки будет нарисована за пределами прямоугольника в точках, где эллипс касается прямоугольника, но он все равно будет нарисован внутри растрового изображения.

Другие вопросы по тегам