DrawEllipse: сглаживание не работает с PenAlignment.Inset - PullRequest
0 голосов
/ 29 мая 2018

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

correct antialiasing broken antialiasing
(обратите внимание на ошибки на левом изображении)

1 Ответ

0 голосов
/ 29 мая 2018

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

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

...