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;
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
..следует сделать..