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

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

在这里插入图片描述


http://www.kler.cn/a/2974.html

相关文章:

  • Linux网络 | 网络层IP报文解析、认识网段划分与IP地址
  • 【letta】The Letta Platform LETTA平台
  • C++模板初识
  • 理解PLT表和GOT表
  • Vue 3.0打造响应式用户界面的新方式
  • 【学术会议征稿-第二届生成式人工智能与信息安全学术会议(GAIIS 2025)】人工智能与信息安全的魅力
  • 【剑指offer】旋转数组的最小数字
  • 【算法】手把手学会二分查找
  • 从暴力递归到动态规划(2)小乖,你也在为转移方程而烦恼吗?
  • 程序员接私活一定要知道的事情,我走的弯路你们都别走了
  • Python 多线程
  • 5.多线程学习
  • 学习黑客十余年,如何成为一名高级的安全工程师?
  • Java奠基】Java经典案例讲解
  • C++ 12 文件操作
  • 锂电池充电的同时也能放电吗?
  • STL--vector
  • 【C语言初阶】循环语句
  • 5G将在五方面彻底改变制造业
  • 【vue3】小小入门介绍
  • Celery使用:优秀的python异步任务框架
  • Spring Bean的定义(含创建Bean的三种方式)
  • CentOS 7 安装 mysql 8.0 客户端
  • [攻城狮计划]如何优雅的在RA2E1上运行RT_Thread
  • MySQL 常见的面试题及其答案
  • 【数据结构】哈希表