现在的问题是,客户觉得写出来的字不平滑,希望用程序处理一下,请大虾们出出主意,有什么可行的方法解决
1.考虑随便乱画,
2.考虑点密集的时候该如何处理
3.可以不考虑曲线实时平滑,如果能行那最好
8 个解决方案
#1
你这是后平滑处理写的字
应该想办法让用户画的时候就是平滑的
graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高
graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质
应该想办法让用户画的时候就是平滑的
graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高
graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质
#2
1、不要跪
2、可以按一定规则取样(比如频率高的取得快一些)作为控制点,然后用类似bezier等来画平滑曲线。
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对象,该对象是点的集合,效果是点点连接的对象,后来我尝试用贝塞尔曲线完成,这个功能,点很密集的时候基本上没效果
上面的意见我会考虑采纳的
是我的错,有一点我忘记说了,我用的是WPF,不是winform,wpf中path标签中可以添加polyline对象,该对象是点的集合,效果是点点连接的对象,后来我尝试用贝塞尔曲线完成,这个功能,点很密集的时候基本上没效果
上面的意见我会考虑采纳的
#5
画的时候用DrawCurve来做,就是平滑的。
#6
colinfang2006:
能不能说的详细一点,
我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度,
能不能说的详细一点,
我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度,
#7
WPF里面如何实现,同样求解。关键是曲线要平滑无锯齿。
#8
#1
你这是后平滑处理写的字
应该想办法让用户画的时候就是平滑的
graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高
graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质
应该想办法让用户画的时候就是平滑的
graphics.SmoothingMode = SmoothingMode.AntiAlias; //抗锯齿
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; //质量最高
graphics.CompositingQuality = CompositingQuality.HighQuality;//消除锯齿,最高品质
#2
1、不要跪
2、可以按一定规则取样(比如频率高的取得快一些)作为控制点,然后用类似bezier等来画平滑曲线。
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对象,该对象是点的集合,效果是点点连接的对象,后来我尝试用贝塞尔曲线完成,这个功能,点很密集的时候基本上没效果
上面的意见我会考虑采纳的
是我的错,有一点我忘记说了,我用的是WPF,不是winform,wpf中path标签中可以添加polyline对象,该对象是点的集合,效果是点点连接的对象,后来我尝试用贝塞尔曲线完成,这个功能,点很密集的时候基本上没效果
上面的意见我会考虑采纳的
#5
画的时候用DrawCurve来做,就是平滑的。
#6
colinfang2006:
能不能说的详细一点,
我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度,
能不能说的详细一点,
我现在就是在Canvas上相应move事件来收集点,可以考虑IDynamicObject提出的控制收集点之间的间距来控制点的密度,
#7
WPF里面如何实现,同样求解。关键是曲线要平滑无锯齿。