WPF InkCanvas 毛笔效果
2021-06-10 14:04
标签:博文 不包含 坐标 研究 修改 images www ref mic https://www.cnblogs.com/LCHL/p/9055642.html#4206298 感谢这位懒羊羊的代码和讲解(下简称羊博主),我在此基础上稍微加了一些东西,希望能使书写效果得到更好的提升吧。建议先从羊博主的博文看起。 1. 卡顿问题 羊博主提出使用WPF中的Freeze()方法将画刷“冻结”。 Freezable 类提供特殊功能,以便在使用修改或复制开销很大的对象时帮助提高应用程序性能。 笔者使用该方法后,书写性能得到了很大提升,但是书写点数目达到万为单位时,出现书写不流畅的情况,且越书写越卡顿。笔者冥思苦想三天三夜,尝试了很多方法都没有得到解决。果然皇天不负有心人,终于还是让我找到了一些改进方法。代码如下: 将DrawImage更改为DrawDrawing,书写性能确实得到了虽然微弱但可见的提升。(自己给自己鼓掌)但是具体有多少提升,笔者并没有做量化。(太懒了) 2. 颜色问题 羊博主博客已完美解决该问题,棒棒哒。??ヽ(°▽°)ノ?) 3. 粗细问题 3.1 书写距离 书写距离应该怎么获得? --- 无非就是两个点之间的距离。 3.2 书写时间 这个参数在Ondraw中没有,如果想关联该参数的话可以研究一下RawStylusInput.Timestamp,(项目组的大神把这些都搭建好了,我用就完事了)该参数可以获取发生输入的时间,两点时间相减就获得了间距的书写时间。两点就是两条线段的终点,因为在绘制时是连续的线,所以后面的线的起点和前面线的终点为相同的点,这个应该很好理解。 3.3 书写速度 通过距离除以时间得出书写速度,自己规定一个速度阈值,在大于这个阈值时,将粗细值缩小;小于这个阈值时,将粗细度放大。该阈值就看你自己想要书写的效果定。建议将进行加减时的值设置为定值,这样线条变化更加平滑。 以下代码不包含时间参数的影响,即只考虑书写间距的影响。所以大家都能用。 部分代码如下: 静态呈现方法与之相同,只要理解了上述的方法,应该就没什么大问题了。笔者就不在此赘述。 可以在最小的粗细度的时候判断是否还是超过现在的线段长度,是的话可以让afterChangeX 和afterChangeY 这两个值直接等于最后的点,从而实现书写过快时的流线间断感。但是线段会不平滑。(图画的比较丑,没有表现出间断的优美感。。。) 打完收工。 有疑问请留言。 WPF InkCanvas 毛笔效果 标签:博文 不包含 坐标 研究 修改 images www ref mic 原文地址:https://www.cnblogs.com/younShieh/p/10602787.html首先贴出本文参考学习的文章吧。
前文
思路
ImageDrawing imageDrawing = new ImageDrawing()
{
ImageSource = imageSource,
Rect = new Rect(afterChangeX - lastThickness / 2.0, afterChangeY - lastThickness / 2.0, lastThickness, lastThickness)
//lastThickness为当前的粗细度;afterChangeX为当前的X坐标,afterChangeY为当前Y坐标
};
imageDrawing.Freeze();
drawingContext.DrawDrawing(imageDrawing);
效果基本满意,如果您有更好的解决方法,希望能得到您的指点。
Point nextPoint = (Point)stylusPoints[1]; //线段的终点
Vector distance = nextPoint - lastPoint; //两点间距
if (distance.Length != 0)
{
double add_Y_UnitAmount = (nextPoint.Y - lastPoint.Y) / distance.Length; //Y轴上的单位变化量
double add_X_UnitAmount = (nextPoint.X - lastPoint.X) / distance.Length;
double afterChangeX = lastPoint.X;
double afterChangeY = lastPoint.Y;
for (double j = 0; j lastDistance) //前个线段的长度大于当前线段的情况,让线条变细
{
lastThickness = (lastThickness - _subThicknessRate) = _thickness ? _thickness : lastThickness + _addThicknessRate;
}
afterChangeX += add_X_UnitAmount;
afterChangeY += add_Y_UnitAmount;
ImageDrawing imageDrawing = new ImageDrawing()
{
ImageSource = imageSource,
Rect = new Rect(afterChangeX - lastThickness / 2.0, afterChangeY - lastThickness / 2.0, lastThickness, lastThickness)
};
imageDrawing.Freeze();
drawingContext.DrawDrawing(imageDrawing); //绘制
}
lastPoint = new Point(afterChangeX, afterChangeY); //保存最后一个优化点,即终点
lastDistance = Convert.ToInt32(distance.Length);
actrualThickness = lastThickness;
}
效果图:
效果图:if (lastThickness == _minThicness)
{
afterChangeX += add_X_UnitAmount * (distance.Length - j - 1);
afterChangeY += add_Y_UnitAmount * (distance.Length - j - 1);
break;
}
上一篇:C#——工厂模式
下一篇:系统激活-Windows10