PS:如果你想用InkCanvas来实现的话,我觉得还是放弃了,卡到爆,根本找不到从哪里下手优化

首先找到了一图类似于毛笔笔触的图片,有了这张图,问题就简单多了。

要做的就只有粗细的处理。先围观下最后的效果。

自定义InkCanvas的示例已经很多,我就不再写了。

主要看下需要重写的两个方法

类一 public class MaoBiDynamicRenderer : DynamicRenderer

重写OnDraw方法

        protected override void OnDraw(System.Windows.Media.DrawingContext drawingContext, System.Windows.Input.StylusPointCollection stylusPoints, System.Windows.Media.Geometry geometry, System.Windows.Media.Brush fillBrush){ImageSource img = new BitmapImage(new Uri("pack://application:,,,/Resources/maobi.png"));//前一个点的绘制。Point prevPoint = new Point(double.NegativeInfinity,double.NegativeInfinity);var w = Global.StrokeWidth + 15;    //输出时笔刷的实际大小Point pt = new Point(0, 0);Vector v = new Vector();            //前一个点与当前点的距离var subtractY = 0d;                 //当前点处前一点的Y偏移var subtractX = 0d;                 //当前点处前一点的X偏移var pointWidth = Global.StrokeWidth; double x = 0, y = 0;for (int i = 0; i < stylusPoints.Count; i++){pt = (Point)stylusPoints[i];v = Point.Subtract(prevPoint, pt);Debug.WriteLine("X " + pt.X + "\t" + pt.Y);subtractY = (pt.Y - prevPoint.Y) / v.Length;    //设置stylusPoints两个点之间需要填充的XY偏移subtractX = (pt.X - prevPoint.X) / v.Length;if (w - v.Length < Global.StrokeWidth)          //控制笔刷大小{pointWidth = Global.StrokeWidth;}else{pointWidth = w - v.Length;                  //在两个点距离越大的时候,笔刷所展示的大小越小}for (double j = 0; j < v.Length; j = j + 1d)    //填充stylusPoints两个点之间{x = 0; y = 0;if (prevPoint.X == double.NegativeInfinity || prevPoint.Y == double.NegativeInfinity || double.PositiveInfinity == prevPoint.X || double.PositiveInfinity == prevPoint.Y){y = pt.Y;x = pt.X;}else{y = prevPoint.Y + subtractY;x = prevPoint.X + subtractX;}drawingContext.DrawImage(img, new Rect(x - pointWidth / 2, y - pointWidth / 2, pointWidth, pointWidth));    //在当前点画笔刷图片prevPoint = new Point(x, y);if (double.IsNegativeInfinity(v.Length) || double.IsPositiveInfinity(v.Length)){ break; }}}stylusPoints = null;}

类二MaoBiStroke : Stroke

重写DrawCore方法代码内容与上面的一致

效果基本上是出来了,但是问题来了。在InkCanvas如果有大量的笔触信息,画得又比较快时,CPU一直占用在14左右,而且不会降。获取到的点也会乱跳画出来就很不爽。

于是我就在每画一笔之后,把这个保存到了一张图里面当成InkCanvas的背景看起来就像是写的一样了。

使用WPF的自定义InkCanvas实现毛笔效果相关推荐

  1. wpf inkcanvas customink 毛笔效果

    联系QQ:715705486 18662431387 用wpf来做毛笔书写效果,需要自定义inkcanvas,基本效果可以,就是连续画很长的笔触时会有卡顿现象.解决方法,做一个判断,当笔触超过一定长度 ...

  2. 【WPF】 InkCanvas 书写毛笔效果

    首先贴出本文参考学习的文章吧. https://www.cnblogs.com/LCHL/p/9055642.html#4206298 感谢这位懒羊羊博主的代码和讲解,我在此基础上稍微加了一些东西,希 ...

  3. WPF InkCanvas 书写毛笔效果

    https://www.cnblogs.com/younShieh/p/10602787.html 转载于:https://www.cnblogs.com/changbaishan/p/1060694 ...

  4. WPF 自定义模板 Button闪亮效果

    原文: WPF 自定义模板 Button闪亮效果 Button的选中Effect,我们看下下面的效果: 让我们再放大一点: 怎么设置上面样式呢?直接设置Button的Effect,有点问题,因为Eff ...

  5. WPF绘制自定义窗口

    原文:WPF绘制自定义窗口 WPF是制作界面的一大利器,下面就用WPF模拟一下360的软件管理界面,360软件管理界面如下: 界面不难,主要有如下几个要素: 窗体的圆角 自定义标题栏及按钮 自定义状态 ...

  6. 在WPF中自定义你的绘制(二)

    在WPF中自定义你的绘制(二) 原文:在WPF中自定义你的绘制(二)   在WPF中自定义你的绘制(二)                                                 ...

  7. WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探

    原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感觉WPF的开发思 ...

  8. C#WPF实现TextBox控件水印效果的两种实现方法

    C#WPF实现TextBox控件水印效果的两种实现方法 在WPF实际项目中往往需要在TextBox中加入水印,来告诉使用者输入TextBox中的内容,如下图片所示: 下面介绍两种方式,来添加上图中的水 ...

  9. android中仿qq最新版抽屉,Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子 ...

最新文章

  1. js数组按照下标对象的属性排序
  2. Sql Server 2008 无法启动T-Sql调试问题的解决方案
  3. SAP作业类型应用简介
  4. java创建阻塞_如何从HttpsURLConnection创建Java非阻塞InputStream?
  5. web前端入门学习 css(7)css高级技巧 (精灵图、字体图标、css三角、鼠标样式、表单轮廓线、文本框拖拽、垂直对齐、图底空白缝隙、margin负值、溢出文字省略号、文字环绕、css初始化)
  6. Eating Soup
  7. S/4HANA里通过key user tool将Extension field添加到UI上的技术实现
  8. JAVA_WEB--jsp语法
  9. jzoj4273-圣章-精灵使的魔法语【线段树】
  10. 用NGINX做负载均衡,keepalived高可用
  11. Python3 网络爬虫:漫画下载,动态加载、反爬虫这都不叫事
  12. VS2010打开就自动关闭问题解决
  13. Scrapy入门程序点评
  14. 惠普p1106打印机安装步骤_惠普p1106打印机驱动程序下载
  15. 北斗导航 | 两个地面站之间的多跳卫星通信链路(附matlab代码)
  16. Jenkins 打包项目出错汇总(持续)
  17. 使用Pr时输出设备没有声音问题
  18. 利用人工势场法的最短路径寻找
  19. 深入探究Qt HTTP的内部构架
  20. NBA球星管理系统 v1.0

热门文章

  1. 华为p8刷机失败后无限重启 强制关机也不行
  2. 如何将“跳一跳”的Python辅助原理移植到“百万英雄”答题中
  3. JavaScript基础功能总结
  4. photoshop样机素材使用
  5. ExcelToDatabase:批量导入Excel文件到MySQL/Oracle/SQL Server数据库的自动化工具
  6. 用“域”来往Word中插入图片
  7. 数据分析实习生面试准备2019.3.6
  8. pnetlab中打开设备自动关机了
  9. excel怎么能把字竖着打出来_如何在EXCEL中竖着打出字来?又如何把字 – 手机爱问...
  10. 关于超变态的装备改造脚本