Сглаженная кривая Безье с помощью GDI / Winforms - c # .net - PullRequest
3 голосов
/ 27 сентября 2011

Я пытаюсь нарисовать кривую Безье в примере приложения Winforms.

Я вычисляю точки Безье, а затем рисую, используя DrawImage, чтобы нарисовать собственную кисть изображения в каждой точке.

Однако я не совсем получаю результат, на который надеялся - результирующая кривая не является гладкой в ​​точках, которые она изгибает (обратите внимание, что координаты Y увеличиваются / уменьшаются с 1px):

Choppy curve

Вот пример «красивой» кривой, быстро нарисованной в «фотошопе» с помощью инструмента «Кисть»:

Nice curve

Кто-нибудь знает, как добиться такого типа "сглаживания"?

Я в основном делаю это:

        using(var g = Graphics.FromImage(bitmap))
        {
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            //points - an array with calculated beziere curve points
            //image - the "image brush" that is painted at each curve point
            foreach (var p in points)
            {
                g.DrawImage(image, p);
                g.Flush();
            }
        }

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Вы, вероятно, получаете это, потому что ваша коллекция points содержит структуры типа Point, который использует Int32 - в результате вы сами квантуете свои очки.

Попробуйте использовать PointF вместо этого - это позволяет рисовать изображения в любом произвольном месте, вместо того, чтобы квантовать их вокруг целых мест.

1 голос
/ 27 сентября 2011

На самом деле вы не используете GDI для рисования линий, поэтому настройки Smoothing и InterpolationMode не действуют. Вы просто рисуете изображение для каждой точки в массиве точек, и поэтому нет никакого соединения этих точек или какого-либо сглаживания. Попробуйте преобразовать вашу коллекцию точек в путь и использовать g.DrawPath , чтобы нарисовать вашу кривую.

Более простым, хотя и безизмерным примером этого будет использование метода DrawLines . Что-то вроде:

g.DrawLines(Pens.Blue, points.ToArray());

Вам даже не нужен цикл для DrawLines и DrawPath. DrawLines похожа на DrawPath бедного человека ...

...