当前位置: 首页 > news >正文

WPF毛笔字实现过程

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:WPF 案例及知识分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:WPF毛笔字实现过程

在这里插入图片描述

文章目录

    • 基本步骤分析
    • 重要代码详解
    • 测试展示

基本步骤分析

下面是使用WPF编写毛笔字签名软件的基本步骤:

创建WPF应用程序: 使用Visual Studio 2019等开发工具创建一个新的WPF应用程序项目,设置好项目名称、位置等基本信息。

添加画布控件: 在WPF应用程序中添加一个Canvas控件,用于绘制签名。

添加事件处理程序: 为Canvas控件添加鼠标事件处理程序和触摸事件处理程序,以便实现手写签名和触摸签名的功能。

实现画笔功能: 定义一个Pen对象,并设置画笔的颜色、宽度等属性,实现在Canvas控件上进行绘画的功能。

实现清除功能: 为Canvas控件添加清除按钮,并实现清除画布的功能。

实现保存功能: 为Canvas控件添加保存按钮,并实现保存签名的功能。你可以将签名保存为图片或者数据流,便于后续使用。

界面美化: 根据实际需求,对界面进行美化,添加适当的控件和交互效果,提升用户体验。

需要注意的是,实现毛笔字签名软件需要考虑到用户的手写习惯和触摸操作习惯,提供简单易用的界面和操作方式,并保证签名的质量和准确性。此外,需要考虑到数据的保存和后续处理,以便满足实际的业务需求。

重要代码详解

首先,我们需要创建一个 WPF 窗口,并在窗口中添加一个 InkCanvas 控件和若干个按钮,用于绑定相应的操作。InkCanvas 是 WPF 中用于手写输入和绘图的控件,它可以记录用户的手写轨迹,并将其转换为矢量图形。通过 InkCanvas ,我们可以模拟毛笔书法的笔画效果,并将用户的签名保存为图片文件。

<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="450" Width="800"><Grid><InkCanvas x:Name="inkCanvas" Background="White" /><StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="10"><Button Content="清空" Margin="5" Click="Clear_Click"/><Button Content="保存" Margin="5" Click="Save_Click"/></StackPanel></Grid>
</Window>

接下来,我们需要在代码中实现清空和保存功能的逻辑。当用户点击“清空”按钮时,我们需要清空 InkCanvas 中的所有笔画轨迹,以便用户重新签名。当用户点击“保存”按钮时,我们需要将 InkCanvas 中的笔画轨迹保存为一张 PNG 格式的图片文件,并将文件名显示在窗口上。

using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Ink;namespace WpfApp1
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Clear_Click(object sender, RoutedEventArgs e){inkCanvas.Strokes.Clear();}private void Save_Click(object sender, RoutedEventArgs e){BitmapSource bitmapSource = InkCanvasToBitmap(inkCanvas);SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.Filter = "PNG Image|*.png";if (saveFileDialog.ShowDialog() == true){using (FileStream fileStream = new FileStream(saveFileDialog.FileName, FileMode.Create)){PngBitmapEncoder encoder = new PngBitmapEncoder();encoder.Frames.Add(BitmapFrame.Create(bitmapSource));encoder.Save(fileStream);}MessageBox.Show("签名已保存:" + saveFileDialog.FileName);}}private BitmapSource InkCanvasToBitmap(InkCanvas inkCanvas){Size size = new Size(inkCanvas.ActualWidth, inkCanvas.ActualHeight);inkCanvas.Measure(size);inkCanvas.Arrange(new Rect(size));RenderTargetBitmap renderTargetBitmap =new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, System.Windows.Media.PixelFormats.Default);renderTargetBitmap.Render(inkCanvas);return renderTargetBitmap;}}
}

测试展示

在这里插入图片描述

在上述代码中,我们使用了 SaveFileDialog 类来显示一个保存文件对话框,让用户选择文件保存路径。我们还使用了 FileStream 类和 PngBitmapEncoder 类来将 InkCanvas 转换为图片,并将其保存到指定的文件路径。最后,我们使用 MessageBox 类来显示保存成功的提示信息。

至此,我们实现了一个简单的毛笔字签名软件,用户可以在 InkCanvas 上手写签名,并将签名保存为一张 PNG 格式的图片文件。该软件还可以支持更多高级功能,例如使用不同的笔刷、颜色和字体来书写,以及支持撤销、重做等操作。通过 WPF 提供的丰富功能,我们可以轻松地扩展和优化毛笔字签名软件。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

相关文章:

WPF毛笔字实现过程

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

MHA实现mysql数据库高可用

目录 MHA原理 MHA工具包 MHA实现mysql高可用实战 MHA原理 ①MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件&#xff08;binlog events&#xff09; ②识别含有最新更新的slave ③应用差异的中继日志&…...

leetcode每日一题:55. 跳跃游戏

系列&#xff1a;贪心算法 语言&#xff1a;java 题目来源&#xff1a;Leetcode55. 跳跃游戏 题目 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输…...

【C++】map 和 set

文章目录一、关联式容器与键值对1、关联式容器2、键值对 pair3、树形结构的关联式容器二、set1、set 的介绍2、set 的使用三、multiset四、map1、map 的介绍2、map 的使用五、multimap一、关联式容器与键值对 1、关联式容器 在C初阶的时候&#xff0c;我们已经接触了 STL 中的…...

基于SpringBoot的酒店管理系统

系统环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/i…...

JAVA框架知识整理

框架知识整理 SpringBoot、SpringMVC、Spring的区别和他们的作用&#xff1f; SpringBoot是一个微服务框架&#xff0c;其简化了Spring应用的创建、运行、测试、部署。使开发人员无需过多的关注XML配置。里面整合了许多框架例如SpringMVC、Spring Security和Spring Data JPA。…...

运算放大器:电压比较器

目录一、单限电压比较器二、滞回电压比较器三、窗口电压比较器最近在学习电机控制&#xff0c;遇到了与运算放大电路相关的知识&#xff0c;然而太久没有接触模拟电路&#xff0c;对该知识已经淡忘了&#xff0c;及时温故而知新&#xff0c;做好笔记&#xff0c;若有错误、不足…...

Linux的基础知识

根目录和家目录根目录&#xff1a;是Linux中最底层的目录&#xff0c;用"/"表示家目录&#xff1a;当前用户所在的路径&#xff0c;用“~”表示&#xff0c;root用户的家目录和普通用户的家目录不一样&#xff0c;普通用户的家目录在/home路径下&#xff0c;每一个用…...

【JavaEE】 IntelliJ IDEA 2022.2最新版Tomcat导入依赖详细教程全解及创建第一个Servlet程序

目录 一、软件资源 二、放置settings.xml文件 三、创建项目 四、引入依赖 ​五、创建目录 六、编写代码 写在前面&#xff1a;☞What is Servlet? Servlet其实是一种实现动态页面的技术。是一组由Tomcat提供给程序员的API&#xff08;应用程序编程接口&#xff09;…...

常见的卷积神经网络结构——分类、检测和分割

本文持续更新~~ 本文整理了近些年来常见的卷积神经网络结构&#xff0c;涵盖了计算机视觉领域的几大基本任务&#xff1a;分类任务、检测任务和分割任务。对于较复杂的网络&#xff0c;本文只会记录其中的核心模块以及重要的网络设计思想&#xff0c;并不会记录完整的网络结构。…...

20230323英语学习

Why Can You “Hear the Ocean” in Seashells? 为啥能在贝壳里“听见海的声音”&#xff1f; We’re told a number of stories as kids. One of the more harmless of these little lies is the one about seashells.You know the one: hold up a seashell to your ear, an…...

【粉丝投稿】上海某大厂的面试题,岗位是测开(25K*16)

简单介绍一句&#xff0c;大专出身&#xff0c;三年经验。跳了四次槽&#xff0c;面试了无数次&#xff0c;现在把自己的面试经验整理出来分享给大家&#xff0c;堪称必杀技&#xff01; 1&#xff0c;一切从实际出发&#xff0c;对实际工作进行适当修饰 2&#xff0c;不会的简…...

shell简单使用介绍

脚本的基本元素声明&#xff0c;在解释并执行当前脚本文件中的语句之前&#xff0c;需要声明使用的命令解释器#一般写的解释器为 #!/bin/bash这里的#不再是注释了&#xff0c;而是必要的声明命令&#xff0c;也就是需要执行的语句注释&#xff0c;对代码进行解释说明分为单行注…...

RK3568平台开发系列讲解(调试篇)内核函数调用堆栈打印方法汇总

🚀返回专栏总目录 文章目录 一、dump_stack 函数二、WARN_ON(condition)函数三、BUG_ON (condition)函数四、panic (fmt...)函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对驱动调试方法进行汇总学习。 一、dump_stack 函数 dump_stack 作用:打印内核调…...

一次内存泄露排查

前因&#xff1a; 因为测试 长时间压测导致 接口反应越来越慢&#xff0c;甚至 导致服务器 崩溃 排查过程 1、top 查看是 哪个进程 占用 内存过高 2、根据 进程 id 去查找 具体是哪个 程序的问题 ps -ef| grep 41356 可以看到 具体的 容器位置 排查该进程 对象存活 状态…...

「Mac安装ps」Adobo Photoshop 2023 下载安装详情教程,支持 AI 插件的 24 版 Photoshop

前言 Adobo Photoshop 2023 已推出&#xff0c;由于目前AI人工智能技术火爆&#xff0c;而很多的 AI 插件最低也需要24版的 photoshop &#xff0c;所以这里我遍搜集并整理了此新版本的 photoshop 安装使用教程&#xff0c;后续也将提供 AI 插件的下载安装教程 安装文件下载 …...

Redis单线程还是多线程?IO多路复用原理

目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程&#xff1f;三、Redis6.0引入多线程四、Redis主线程和IO线程是如何完成请求的&#xff1f;1、服务端和客户端建立socket连接2、IO线程读取并解析请求3、主线程执行请求命令4、IO线程会写回socket和主线程清…...

小菜鸟Python历险记:(第五集)

今天写的文章是记录我从零开始学习Python的全过程。在Python中对方法进行备注的时候&#xff0c;往往都是写在方法中的第一行所在位置。在书写注释以后&#xff0c;在调用方法的时候&#xff0c;鼠标点击方法会有一个浮动的提示显示备注内容。具体如下图所示&#xff1a;注释的…...

【思维模型】五分钟了解<复利思维>,为何学习复利思维?什么是复利思维?如何应用复利思维?

【思维模型】五分钟了解&#xff1c;复利思维&#xff1e;&#xff0c;为何学习复利思维&#xff1f;什么是复利思维&#xff1f;如何应用复利思维&#xff1f;1. 为何学习复利思维&#xff1f;2. 什么是复利思维&#xff1f;3. 如何应用复利思维&#xff1f;4. 小结参考&#…...

Vue.js语法详解:从入门到精通

Vue.js是一个流行的JavaScript框架&#xff0c;用于构建用户界面。它的核心特性包括数据双向绑定、组件化架构、虚拟DOM和响应式系统等。在本文中&#xff0c;我们将深入探讨Vue.js的语法&#xff0c;帮助读者更好地理解和应用Vue.js。1.模板语法Vue.js的模板语法采用了类似HTM…...

程序员的代码行数越少越好?

有些人可能会认为&#xff0c;应用程序中的代码行越少&#xff0c;就越容易阅读。这句话只有部分正确&#xff0c;我认为代码可读性的度量标准包括&#xff1a;代码应具备一致性代码应具备自我描述性代码应具备良好的文档代码应使用稳定的现代功能代码不应过于复杂代码的性能不…...

【每日一题Day156】LC1032字符流 | 字典树

字符流【LC1032】 设计一个算法&#xff1a;接收一个字符流&#xff0c;并检查这些字符的后缀是否是字符串数组 words 中的一个字符串。 例如&#xff0c;words ["abc", "xyz"] 且字符流中逐个依次加入 4 个字符 a、x、y 和 z &#xff0c;你所设计的算法…...

V2G模式下含分布式能源网优化运行研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&#x1f381; 目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &am…...

手写一个简单的RPC框架

学习RPC框架&#xff0c;由繁化简&#xff0c;了解其本质原理 文章目录项目简介什么是RPC&#xff1f;项目模块项目代码common模块client模块server模块framework模块测试项目简介 什么是RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff09;即远程过程调用&am…...

【剑指offer】旋转数组的最小数字

&#x1f451;专栏内容&#xff1a;剑指offer⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录一、题目描述1、题目2、示例示例1示例2二、题目分析1、暴力法2、二分法三、代码汇总1、暴力法2、二分法一、题目描述 1、题…...

【Dorker】Portainer轻量级可视化工具

文章目录Portainer简介登录Portainer第一次登录需创建admin&#xff0c;访问地址&#xff1a;xxx.xxx.xxx.xxx:9000选择local选项卡后本地docker详细信息展示安装nginx私有镜像仓库管理Portainer简介 Portainer是Docker的图形化管理工具&#xff0c;提供状态显示面板、应用模板…...

基于 vue.js 进行组件封装的方案

摘要&#xff1a;本文将介绍如何基于 vue.js 进行组件封装的方案。我们将从分析组件封装的优势开始&#xff0c;然后依次介绍 vue.js 的基本概念&#xff0c;以及如何创建、封装和使用自定义组件。最后&#xff0c;我们将通过一个实际的示例&#xff0c;演示如何实现一个基于 v…...

【Unityc#专题篇】之c#基础篇

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

Python(白银时代)——模块、包、异常

异常 概念 程序运行时&#xff0c;如果Python 解释器遇到了错误&#xff0c;会停止程序运行&#xff0c;并且提示错误信息&#xff0c;这就是异常 程序停止执行并提示错误信息的动作&#xff0c;称为 抛出异常 异常捕获 try: 里面的代码&#xff0c;不确定是否能够正常执行. …...

小程序和Vue写法的区别

小程序和Vue写法的区别主要有以下几点&#xff1a; 语法不同&#xff1a;小程序使用的是WXML、WXSS和JS&#xff0c;而Vue使用的是HTML、CSS和JSX。 数据绑定方式不同&#xff1a;小程序使用的是双向数据绑定&#xff0c;而Vue使用的是单向数据流。 1&#xff09;在小程序中需…...

分销系统商城定制开发/百度快速排名优化服务

类加载器&#xff0c;顾名思义&#xff0c;类加载器&#xff08;class loader&#xff09;用来加载 Java 类到 Java 虚拟机中。一般来说&#xff0c;Java 虚拟机使用 Java 类的方式如下&#xff1a;Java 源程序&#xff08;.java 文件&#xff09;在经过 Java 编译器编译之后就…...

保定做网站的公司/免费发布信息的平台

作为一名产品经理&#xff0c;最奢侈的愿望是什么&#xff1f;“有一个自己能控制的团队去实现心目中的产品”&#xff0c;应该不仅仅是我有这个想法吧。按照比较流行的说法&#xff0c;产品经理是只负责产品规划与管理、不直接负责团队管理的“经理”&#xff0c;但却身负推动…...

网站路径怎么做/做推广哪个平台效果好

一、分类 中国速冻食品根据产品种类可大致分为速冻调制食品&#xff08;可细分为速冻鱼糜制品、速冻肉制品两类&#xff09;、速冻面米制品、速冻其他食品三类。其中&#xff0c;速冻面米制品主要包括速冻水饺、汤圆、包子、油条、芝麻球等&#xff0c;是速冻食品中市场规模最…...

万网做网站/推广竞价

传送门&#xff1a; TCP/IP协议不清楚请回看[TCP/IP协议理论](http://blog.csdn.net/u010710458/article/details/77652679"optional title") ###1、ping 10.13.3.213 -l 3000 通过ping同一个局域网内的主机&#xff0c;其中通过了两个路由器&#xff0c;并且数据大于…...

建设银行官方网站打不开/googleseo优化

参考&#xff1a;https://blog.csdn.net/maweifei/article/details/51221259 # 示例&#xff1a; img_ cv::Mat::zeros(pic_height_, pic_width_, CV_8UC1);Mat不但是一个非常有用的图像容器类&#xff0c;同时也是一个通用的矩阵类。 Mat矩阵(图像容器)创建时CV_8UC1、CV_8U…...

推广网站的几种方法/网站关键词优化的价格

Linux 大作业局域网聊天室项目组成员列表课序号学号姓名班级任务分工组员02201192网1103客户端代码&#xff0c;详细设计02201192软1113引言需求分析概要设计&#xff0c;界面代码02201192软1113服务器&#xff0c;客户端代码&#xff0c;总结02201192软1113文档参与大连理工大…...