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