3

サンプルのWinformsアプリケーションでベジェ曲線をペイントしようとしています。

ベジェポイントを計算してから、DrawImageを使用してペイントし、各ポイントにカスタムイメージブラシを描画しています。

ただし、期待した結果が正確に得られていません。結果の曲線は、曲がるポイントで滑らかではありません(Y座標は1pxで増減することに注意してください)。

途切れ途切れの曲線

これは、ブラシツールを使用して「photoshop」ですばやくペイントされた「素敵な」曲線の例です。

素敵なカーブ

この種の「アンチエイリアス」を実現する方法を知っている人はいますか?

私は基本的にこれをやっています:

        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();
            }
        }

ありがとうございました!

4

2 に答える 2

2

pointsコレクションに type の構造体が含まれているため、おそらくこれを取得しています。PointこれはInt32、結果として、ポイントを自分で量子化しています。

代わりに使用してみてくださいPointF- これにより、整数位置の周りで量子化されるのではなく、任意の位置に画像を描画できます。

于 2011-09-26T21:25:29.210 に答える
1

実際には GDI を使用して線を描画していないため、Smoothing と InterpolationMode の設定は効果がありません。ポイント配列のすべてのポイントごとに画像を描画しているだけなので、それらのポイントを接続したり、アンチエイリアスを行ったりする必要はありません。ポイント コレクションをパスに変換し、g.DrawPathを使用して曲線を描画してみてください。

ベジエのない、より単純な例は、DrawLinesメソッドを使用することです。何かのようなもの:

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

DrawLines と DrawPath のループも必要ありません。DrawLines は貧乏人の DrawPath のようなものです...

于 2011-09-26T21:19:43.133 に答える