热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#Winform实现手写录入签名与保存为透明png图片

C#Winform实现手写录入签名与保存为透明png图片原理效果图实现代码原理在Winform窗体程序中实现鼠标手写输入其实就是画线,基本实现原理是放置一个Pict

C#Winform实现手写录入签名与保存为透明png图片

  • 原理
  • 效果图
  • 实现代码


原理

在Winform窗体程序中实现鼠标手写输入其实就是画线,基本实现原理是放置一个PictureBox控件,订阅此控件的MouseMove和MouseDown事件,然后通过System.Drawing.Drawing2D.GraphicsPath在MouseMove事件中不断的画线。

效果图

在这里插入图片描述

实现代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;namespace WindowsFormsApplication2
{public partial class Form1 : Form{#region 定义变量private System.Drawing.Drawing2D.GraphicsPath mousePath &#61; new System.Drawing.Drawing2D.GraphicsPath();//画笔透明度private int myAlpha &#61; 100;//画笔颜色对象private Color myUserColor &#61; new Color();//画笔宽度private int myPenWidth &#61; 3;//签名的图片对象public Bitmap SavedBitmap;#endregionpublic Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string url &#61; Cachet.CreatPublicSeal.CreatSeal("青岛弯弓信息技术有限公司", "数据服务部", "e:\\seal");this.pictureBox1.Image &#61; Image.FromFile(url);Console.WriteLine(url);}private void Form1_Load(object sender, EventArgs e){this.pictureBox1.BackColor &#61; Color.White; //设置图片初始背景色为白色}#region 鼠标移动事件处理private void pictureBox1_MouseMove(object sender, MouseEventArgs e){if (e.Button &#61;&#61; System.Windows.Forms.MouseButtons.Left){try{mousePath.AddLine(e.X, e.Y, e.X, e.Y);}catch (Exception ex){MessageBox.Show(ex.Message);}}pictureBox1.Invalidate();}#endregion#region 鼠标按下事件处理private void pictureBox1_MouseDown(object sender, MouseEventArgs e){if (e.Button &#61;&#61; System.Windows.Forms.MouseButtons.Left){mousePath.StartFigure();}}#endregion#region 图片空间画图事件处理private void pictureBox1_Paint(object sender, PaintEventArgs e){try{myUserColor &#61; System.Drawing.Color.Blue;myAlpha &#61; 255;Pen CurrentPen &#61; new Pen(Color.FromArgb(myAlpha, myUserColor), myPenWidth);e.Graphics.DrawPath(CurrentPen, mousePath);}catch { }}#endregion#region 把图片中的内容保存为透明png图片private void btnSave_Click(object sender, EventArgs e){SavedBitmap &#61; new Bitmap(pictureBox1.Width, pictureBox1.Height);pictureBox1.DrawToBitmap(SavedBitmap, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));#region 保存为透明的png图片Bitmap bmp &#61; SavedBitmap;BitmapData data &#61; bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);int length &#61; data.Stride * data.Height;IntPtr ptr &#61; data.Scan0;byte[] buff &#61; new byte[length];Marshal.Copy(ptr, buff, 0, length);for (int i &#61; 3; i < length; i &#43;&#61; 4){if (buff[i - 1] >&#61; 230 && buff[i - 2] >&#61; 230 && buff[i - 3] >&#61; 230){buff[i] &#61; 0;}}Marshal.Copy(buff, 0, ptr, length);bmp.UnlockBits(data);bmp.Save("e:\\zhenglibing.png", ImageFormat.Png);#endregion}#endregion#region 清空图片的内容private void btnClear_Click(object sender, EventArgs e){pictureBox1.CreateGraphics().Clear(Color.White);mousePath.Reset();}#endregion}
}


推荐阅读
  • C#编程中按钮控件的使用与优化 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 在托管C++中开发应用程序时,遇到了如何声明和操作字符串数组的问题。本文详细探讨了字符串数组在托管C++中的应用与实现方法,包括声明、初始化、遍历和常见操作技巧,为开发者提供了实用的参考和指导。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • RxJava 中 Observable.singleElement() 方法详解与实例代码分析 ... [详细]
author-avatar
手机用户3312丿075454
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有