立聪堂德州十三局店 发表于 2022-12-23 20:26:12

WPF 基于Geometry的橡皮擦功能

这是我大约半年前就想写的随笔。
功能很简单。
就是基于Geometry的画布,记录鼠标轨迹生成PathGeometry。再就是添加删除Path的功能也就是path笔迹删除。
目前是实现了两种方式。
1 基于预览擦除
https://img2023.cnblogs.com/blog/830181/202212/830181-20221222225609210-1753017769.gif
2 实时擦除
https://img2023.cnblogs.com/blog/830181/202212/830181-20221222225711906-375630483.gif
 
 
 
两者在具体技术上没有任何的区别都是依靠Geometry.Combine的A-B图形运算       
也就是A图形中减去B图形并返回一个新的Geometry类型的图形。
同时也都会用上一个GetWidenedPathGeometry的Geometry方法。
这个方法会根据原有的path轨迹并使用一个Pen的笔宽去描绘一个同轨迹的形状。
不过需要注意的是,获取GetWidenedPathGeometry之后绘制这个geometry时不能再使用pen了,如果有必要时则必须要保证新的pen的笔宽小于生成时的笔宽。不然会产生绘制出来的图形全使毛刺的问题。
 
https://img2023.cnblogs.com/blog/830181/202212/830181-20221222232132440-1646179841.gif
 
 
当然这个也是绘制的角有关。
如果使用了一下代码的Pen则会产生另外一种现象。
private Pen _normalPen = new Pen(new SolidColorBrush(Colors.Black), 10)
      {
            StartLineCap = PenLineCap.Round,
            EndLineCap = PenLineCap.Round,
            LineJoin = PenLineJoin.Round,
            MiterLimit = 1
      }; 
https://img2023.cnblogs.com/blog/830181/202212/830181-20221222232259247-1365976272.gif
 
还会有另外一种现象,是毛刺朝内,一直时间想不起来怎么弄了...(待我想起来补图...)
基本原因都是GetWidenedPathGeometry没有处理好的原因。
没怎么放代码,因为如果能需要这个功能,你肯定是缺少思路。很多事情就是差灵光一闪了。
demo中包含画布,画笔,橡皮擦1,橡皮擦2 总共不到400行。
总的来说没啥称之为技术的东西,很多是经验,我下面提供了源代码,可以自己看看。
 
说明:实时擦除部分是直接参考使用wpf技术实现画图工具 - 孤独成派 - 博客园 (cnblogs.com)这位大佬的。
 
源代码下载
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: WPF 基于Geometry的橡皮擦功能