WPF 粉笔绘制

news/2024/11/28 8:28:24/文章来源:https://www.cnblogs.com/wuty/p/18570838

在做白板书写的时候,会有各种笔的绘制,比如 书写笔、马克笔、演示笔等等。粉笔的功能需求也是很有必要的。

上网搜了一圈,几乎没有绘制粉笔的。

有的是毛笔、楷体等绘制的如下博客:

wpf inkcanvas customink 毛笔效果_wpf inkcanvas 笔锋-CSDN博客

【WPF】 InkCanvas 书写毛笔效果-CSDN博客

 

绘制粉笔的思路,一开始是源于 github的一个仓库:mychalkboard/MyChalkBoard: MyChalkBoard is an application for you to quickly sketch with a chalk.

对应的网页的链接:MyChalkBoard

思路:就是用一个通用的笔头(ImageSource),利用Stroke 捕获到的StylusPoints的点,生成对应的点的坐标,调用drawingContext.DrawImage,绘制图案

1、生成笔头

找UI绘制一个粉笔形状的图片,以Png为例:

 2、支持修改颜色

参考了该博文: 2018-8-10-WPF-修改图片颜色-CSDN博客

只要是修改 WriteableBitmap 的RGBA的值,达到替换颜色的效果

 public static unsafe ImageSource ConvertImageColor(Color newColor, WriteableBitmap writableBitmap){var bitmap = writableBitmap;if (bitmap == null){return null;}bitmap.Lock();var length = bitmap.PixelWidth * bitmap.PixelHeight *bitmap.Format.BitsPerPixel / 8;var backBuffer = (byte*)bitmap.BackBuffer;var byteList = new byte[length];for (int i = 0; i + 4 < length; i = i + 4){byteList[i] = newColor.B;byteList[i + 1] = newColor.G;byteList[i + 2] = newColor.R;byteList[i + 3] = backBuffer[i + 3];}bitmap.Unlock();bitmap = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight, 96, 96,bitmap.Format, bitmap.Palette);bitmap.Lock();bitmap.WritePixels(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight),byteList, bitmap.BackBufferStride, 0);bitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));bitmap.Unlock();return bitmap;}

3、收集点迹

主要是调用了我们组内自己封装的一套基于鼠标、触摸汇总的笔迹点迹收集的算法,通过 Down、Move、Up以及分段汇总的方式,收集并呈现笔迹

4、自定义补点

由于通过设备采集到的点,会有疏密的区分,所以对于比较稀疏的点,需要通过补点的方式,达到减少锯齿的效果,具体的补点的距离,因业务需要不同,可以通过调节参数的方式做适配

 //标识上一个点var previousPoint = new Point(double.NegativeInfinity, double.NegativeInfinity);for (int i = 0; i < stylusPoints.Count; i++){var pressureFactor = stylusPoints[i].PressureFactor * 2;var currentPoint = stylusPoints[i].ToPoint();var vector = previousPoint - currentPoint;var newWidth = width * pressureFactor;//作为基准值var baseWidth = newWidth / 1.5;if (!double.IsInfinity(vector.Length) && vector.Length > baseWidth){var w2 = newWidth;if (newWidth - vector.Length > newWidth)w2 = newWidth - vector.Length;var newPointCount = (int)(vector.Length / (baseWidth)) * 2;var dx = (currentPoint.X - previousPoint.X) / newPointCount;var dy = (currentPoint.Y - previousPoint.Y) / newPointCount;for (int pointCount = 0; pointCount < newPointCount; pointCount++){var newX = previousPoint.X + dx * (pointCount + 1);var newY = previousPoint.Y + dy * (pointCount + 1);drawingContext.DrawImage(imageSource, new Rect(newX - w2, newY - w2, w2 * 2, w2 * 2));}}else{Rect rectangle = new Rect(currentPoint.X - newWidth, currentPoint.Y - newWidth, newWidth * 2, newWidth * 2);drawingContext.DrawImage(imageSource, rectangle);}previousPoint = currentPoint;

 

5、绘制点迹

通过以上4个前提步骤,就可以计算出来笔迹的大小,通过调用 drawingContext.DrawImage 的方式把带粉笔头的Image绘制出来

drawingContext.DrawImage(imageSource, new Rect(newX - w2, newY - w2, w2 * 2, w2 * 2));

 

6、效果如下:

普通书写

 

重力书写:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841793.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙NEXT开发案例:温度转换

【引言】 温度是日常生活中常见的物理量,但不同国家和地区可能使用不同的温度单位,如摄氏度(Celsius)、华氏度(Fahrenheit)、开尔文(Kelvin)、兰氏度(Rankine)和列氏度(Reaumur)。为了方便用户在这些温度单位之间进行快速准确的转换,我们开发了一款温度转换工具。…

团队项目-7

一、昨日已完成的任务 前后端交互,调用接口完成页面。导入数据等 今日计划完成的任务 继续做好功能,测试运行 工作中遇到的困难 测试运行时出现不少问题,服务器连不上等问题 项目迁入记录代码:总结 一周的学习收获良多,项目实战难度大的同时也给了我们很多动力,是一次珍贵…

windows安全中心,永久卸载工具

使用方法 2024Goby红队版工具分享,附2024年漏洞POC下载 下载链接: https://pan.quark.cn/s/4fc2712a2afc一路回车,选项Y即可耐心等待几秒种,自动重启此时打开windows安全中心,已经完全不能使用了,响应的杀毒功能也关了往期推荐 【渗透测试】DC1~9(全) Linux提权靶机渗透教…

团队项目-6

一、昨日已完成的任务 学习有关springboot,vue等前后端知识,完善数据库和底层框架,学习有关知识,继续做功能接口。今日计划完成的任务 前后端交互,调用接口完成页面。导入数据等 工作中遇到的困难 目前调用接口出现问题,接口有些错误 代码迁入记录项目模块与代码总结 时间…

CTF学习(18)MISC(面具下的flag)

1.解压文件后发现是.wav格式的文件--->使用audacity打开后发现存在摩斯电码摩斯电码: ..... -... -.-. ----. ..--- ..... -.... ....- ----. -.-. -... ----- .---- ---.. ---.. ..-. ..... ..--- . -.... .---- --... -.. --... ----- ----. ..--- ----. .---- ----. .---…

composer引入本地自己开发的php扩展包

开发自己的php扩展包 一、创建扩展包目录结构 1. 创建目录hoo-tool,在目录下创建目录 src 2. 在hoo-tool 目录下 运行命令:composer init3. 运行完命令的效果{"name": "hoo/tool","description": "hoo Tool kit for PHP","type…

博客园 geek 主题备份

预览页面定制 CSS 代码禁用模板默认CSS#loading{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999;background-color:#f4f5f5;pointer-events:none;}.loader-inner{will-change:transform;width:40px;height:40px;position:absolute;top:50%;left:50%;margin:-20px …

【cesium重新梳理】1.cesium知识整理

之前零零碎碎学过、用过cesium,但也没做记录,现在重新整理一下,方便学习回顾。 1.cesium简介 CesiumJS是一个开源JavaScript库,用于创建具有最佳性能、精度、视觉质量和易用性的世界级3D地球仪和地图。从航空航天到智能城市再到无人机,各行各业的开发人员都使用CesiumJS创…

WebRTC 作者加入 OpenAI 主导实时 AI 项目;TTS 小模型 OuteTTS v0.2 发布:声音克隆+多语言

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

关于mac安装ENSP的一点个人看法

如何在mac上安装ensp呢 目前主流的教程都是教大家在PD上面安装ENSP,但是这样就不可避免的会有两个问题,第一内存够用?第二CPU是什么型号的? 大多数教程中都忽略了这两个问题,就算有,也只是泛泛而言,并没有真正的安装ENSP并且测试。首先MAC电脑要安装ENSP,必须要满足一个…

[Avalonia] 练习一:搭建Avalonia+Prism+Material项目

这是个练手项目,初次接触Avalonia,决定搭建一个架构由Prism实现,UI基于Material的演示基本控件、自定义控件、遮罩、弹窗、标签页等UI基础的桌面项目,实现这些UI基础,基于WPF转Avalonia应该就没太大的问题了。 一、新建项目。新建空白解决方案AvaloniaApps。 新建项目,选…

【cesium】修改底图颜色为蓝色科技范儿

cesium中,默认的底图颜色往往难以满足个性化需求,而【蓝色科技】风格常常备受青睐,本文从实操角度介绍实现方法。 简单来说,我们所用的方法叫做【反色滤镜】,总的分为2个步骤,反色,过滤。具体做法如下: 首先要获取目标影像图层,这里不能直接对div进行操作,因为会将地…