Несоответствия углов прямоугольника со скругленными углами в C#

Используя С# WinForms, у меня есть обычная метка, которую я заполняю закругленными углами. Проблема, с которой я сталкиваюсь, заключается в том, что полученные углы не всегда закруглены.

Для простоты понимания я создал 4 метки со скругленными углами, радиусом от 1 до 5. Я добавил к метке одну границу контура для простоты видимости, но даже без единого контура результаты одинаковы. Я также увеличил изображения этикеток, чтобы мы могли более четко видеть углы.

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

Радиус 1

Использование радиуса 2 и 3 соответственно дает тот же результат внизу.

Радиус 2 и 3 соответственно

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

Радиус 4

Радиус 5

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

Код, который я использую для создания заполненного прямоугольника, предположительно очень простой, как в примере, взятом из Как нарисовать прямоугольник со скругленными углами

public static GraphicsPath draw_rectangle(Rectangle bounds, int radius)
    {
        int diameter = radius * 2;
        Size size = new Size(diameter, diameter);
        Rectangle arc = new Rectangle(bounds.Location, size);
        GraphicsPath path = new GraphicsPath();

        if (radius == 0)
        {
            path.AddRectangle(bounds);
            return path;
        }

        // top left arc  
        path.AddArc(arc, 180, 90);

        // top right arc  
        arc.X = bounds.Right - diameter;
        path.AddArc(arc, 270, 90);

        // bottom right arc  
        arc.Y = bounds.Bottom - diameter;
        path.AddArc(arc, 0, 90);

        // bottom left arc 
        arc.X = bounds.Left;
        path.AddArc(arc, 90, 90);

        path.CloseFigure();
        return path;            
    }

Я изучил и понял, что делает код и как он работает, я получаю углы и развертку, но я ни в коем случае не опытный графический манипулятор, поэтому я не знаю, делаю ли я что-то не так или есть способ чтобы улучшить код для согласованности всех углов.

Ваша помощь и\или пояснения приветствуются.


person Bazïnga    schedule 10.02.2020    source источник
comment
Как пользователь "масштабирует"?   -  person Neil    schedule 10.02.2020
comment
@ Нил, я думаю, он говорит об изменении размера. Так пользователь увеличит форму   -  person Mong Zhu    schedule 10.02.2020
comment
Это простое масштабирование одним нажатием кнопки; это просто увеличение надписи и шрифта, ничего особенного. При увеличении фон метки перекрашивается и, очевидно, увеличивается радиус, и именно здесь это становится некрасивым.   -  person Bazïnga    schedule 10.02.2020
comment
Есть разница между простым увеличением существующего растрового изображения и рисованием чего-то большего с более высоким разрешением. Если вы делаете первое, то вы мало что можете с этим поделать.   -  person Neil    schedule 10.02.2020
comment
@ Нил, да, я согласен. Я просто меняю свойства размера метки (высота, ширина), а также размер шрифта. Например, если не учитывать шрифт, размер этикетки по умолчанию составляет 50,30; поэтому я заполняю прямоугольник с закругленными углами радиусом 10. При увеличении я устанавливаю размер метки на 100,60; поэтому я заполняю прямоугольник со скругленными углами радиусом 20. Изменение размера вызывает событие рисования, при котором происходит заливка, я не возился с какими-либо разрешениями.   -  person Bazïnga    schedule 10.02.2020
comment
@ Джими спасибо миллион. Я бегло просмотрел примеры. Кажется, у них на несколько строк кода больше, чем у меня, и образцы выглядят хорошо, я посмотрю.   -  person Bazïnga    schedule 10.02.2020
comment
Плакат связанного ответа здесь. Я только что нашел ваш вопрос. Вы не упомянули, как вы выполняете масштабирование (Graphics.ScaleTransform?), какие SmoothingMode и PixelOffsetMode вы используете и каковы точные координаты, когда вы рисуете/заполняете объекты в определенных границах. Все это должно быть установлено правильно, особенно при использовании масштабирования; в противном случае результат может быть смещен или размыт. Если вопрос по-прежнему актуален через год или около того, и вы предоставите недостающую информацию, я могу добавить ответ.   -  person György Kőszeg    schedule 03.07.2021