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