跪求高手帮忙解决,曲线平滑问题

时间:2022-07-24 08:52:00
实现Windows画画板那样的功能,可以随手画画,写字,

现在的问题是,客户觉得写出来的字不平滑,希望用程序处理一下,请大虾们出出主意,有什么可行的方法解决

1.考虑随便乱画,
2.考虑点密集的时候该如何处理
3.可以不考虑曲线实时平滑,如果能行那最好

8 个解决方案

#1


你这是后平滑处理写的字
应该想办法让用户画的时候就是平滑的

graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高
graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质 

#2


1、不要跪
2、可以按一定规则取样(比如频率高的取得快一些)作为控制点,然后用类似bezier等来画平滑曲线。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
    }

    List<Point> points = new List<Point>();
    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (this.Capture)
        {
            Point last = this.points.Count > 0 ? points[points.Count - 1] : new Point(-100,-100);
            // 这里取样规则是下一点离前一点超过一定的距离,可以自己定义。
            if (Math.Abs(e.X - last.X) + Math.Abs(e.Y - last.Y) > 15)
            {
                points.Add(e.Location);
                this.Invalidate();
            }
        }
        else
        {
            points.Clear();
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        if (this.points.Count > 2)
        {
            e.Graphics.DrawCurve(Pens.Blue, this.points.ToArray());
        }
    }
}

#3


用WPF做吧,WPF本身自带抗锯齿等让图片平滑的功能

#4


楼上两位说的都很对,但是这都是GDI+里面的做法,

是我的错,有一点我忘记说了,我用的是WPF,不是winform,wpf中path标签中可以添加polyline对象,该对象是点的集合,效果是点点连接的对象,后来我尝试用贝塞尔曲线完成,这个功能,点很密集的时候基本上没效果

上面的意见我会考虑采纳的

#5


画的时候用DrawCurve来做,就是平滑的。

#6


colinfang2006:
   能不能说的详细一点,
   我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度,

#7


WPF里面如何实现,同样求解。关键是曲线要平滑无锯齿。

#8


该回复于2011-04-19 09:55:10被版主删除

#1


你这是后平滑处理写的字
应该想办法让用户画的时候就是平滑的

graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高
graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质 

#2


1、不要跪
2、可以按一定规则取样(比如频率高的取得快一些)作为控制点,然后用类似bezier等来画平滑曲线。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
    }

    List<Point> points = new List<Point>();
    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (this.Capture)
        {
            Point last = this.points.Count > 0 ? points[points.Count - 1] : new Point(-100,-100);
            // 这里取样规则是下一点离前一点超过一定的距离,可以自己定义。
            if (Math.Abs(e.X - last.X) + Math.Abs(e.Y - last.Y) > 15)
            {
                points.Add(e.Location);
                this.Invalidate();
            }
        }
        else
        {
            points.Clear();
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        if (this.points.Count > 2)
        {
            e.Graphics.DrawCurve(Pens.Blue, this.points.ToArray());
        }
    }
}

#3


用WPF做吧,WPF本身自带抗锯齿等让图片平滑的功能

#4


楼上两位说的都很对,但是这都是GDI+里面的做法,

是我的错,有一点我忘记说了,我用的是WPF,不是winform,wpf中path标签中可以添加polyline对象,该对象是点的集合,效果是点点连接的对象,后来我尝试用贝塞尔曲线完成,这个功能,点很密集的时候基本上没效果

上面的意见我会考虑采纳的

#5


画的时候用DrawCurve来做,就是平滑的。

#6


colinfang2006:
   能不能说的详细一点,
   我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度,

#7


WPF里面如何实现,同样求解。关键是曲线要平滑无锯齿。

#8


该回复于2011-04-19 09:55:10被版主删除