DrawEllipse: Ellipse выходит за рамки размера растрового изображения

Я хочу нарисовать круг с DrawEllipse по указанному Bitmapс таким же размером растрового изображения, но в результате получается, что круг выглядит обрезанным по краям.
Почему эта проблема?

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;

результат Drawellipse

1 ответ

Решение

По умолчанию Pen имеет 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));
}

введите описание изображения здесь

Обновление: если вы хотите включить сглаживание для объекта "Графика", вам потребуется 1 или 2 дополнительных пикселя по обеим сторонам обводки пера для пикселей сглаживания. Использование меньшего ограничивающего прямоугольника теперь нельзя избежать. Но..:

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

..следует сделать..

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