WPF毛笔字实现过程

news/2024/11/8 13:45:37/

在这里插入图片描述

✅作者简介: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知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述


http://www.ppmy.cn/news/34627.html

相关文章

【面试】-- Hive高频面试题目

一、请描述一下数据倾斜,并提供解决方案?  定义:由于数据分布不均匀,导致大量数据集中到一点,造成数据热点。现象是100个 task, 有一个运行了 1个小时,其他99个只有 10分钟。本质是数据量太大。原因:key 分布不均匀、sql倾斜join、建表时类型有问题算子:count、dist…

蓝桥杯每日一真题—— [蓝桥杯 2021 省 AB2] 完全平方数(数论,质因数分解)

文章目录[蓝桥杯 2021 省 AB2] 完全平方数题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示思路&#xff1a;理论补充&#xff1a;完全平方数的一个性质&#xff1a;完全平方数的质因子的指数一定为偶数最终思路&#xff1a;小插曲&am…

Nginx可视化管理工具 - Nginx Proxy Manager

一、介绍 nginx-proxy-manager 是一个反向代理管理系统,它基于Nginx,具有漂亮干净的 Web UI。还可以获得受信任的 SSL 证书,并通过单独的配置、自定义和入侵保护来管理多个代理。 其官网地址如下: https://nginxproxymanager.com/ 二、安装 第一步:192.168.1.108服务…

五.ElasticSearch的基础+实战

五.ElasticSearch的基础+实战 1.Elasticsearch的是什么? 2.Elasticsearch的作用是什么? 3.Elasticsearch的核心思想? 4.Elasticsearch启动与简单使用 5.kibana结合elasticsearch实现简单的增删改查 6.elasticsearch安装中文分词器 7.elasticsearch结合springboot开发…

STM32 ADC+定时器+DMA+FFT

本次实现的功能为单片机DAC输出一个正弦波&#xff0c;然后ADC定时采样用DMA输出&#xff0c;最后对DAC输出的波形进行FFT。单片机STM32F103ZET6内部时钟一、配置ADCADC端口为PA1&#xff0c;采用DMA输出&#xff0c;定时器3触发定时器时钟64M&#xff0c;分频后为102.4KHzADC采…

typescript(元组、枚举、类、泛型)

元组 数组合并了相同类型的对象&#xff0c;而元组&#xff08;Tuple&#xff09;合并了不同类型的对象 // 数组 let arr:number[] [1,2] // 元组 let arr1:[string,number][1,2] // 但是使用联合类型/类型别名 同样可以实现元组的效果 // 区别是元组对每一项进行类型约束 …

给程序加个进度条吧,1行Python代码,快速添加~

大家好&#xff0c;这里是程序员晚枫。 你在写代码的过程中&#xff0c;有没有遇到过以下问题&#xff1f; 已经写好的程序&#xff0c;想看看程序执行的进度&#xff1f; 在写代码批量处理文件的时候&#xff0c;如何显示现在处理到第几个文件了&#xff1f; &#x1f446…

字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...

在互联网做了几年之后&#xff0c;去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好&#xff0c;更重要的是&#xff0c;它是对你专业能力的背书&#xff0c;大厂工作背景多少会给你的简历增加几分竞争力。 但说实话&#xff0c;想进大厂还真没那么容易。最近面试字…