C# 实现电子签名

这篇具有很好参考价值的文章主要介绍了C# 实现电子签名。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本项目基于Emgu.CV(C#下OpenCv的封装)开发的,编译器最新版Vs2022,编译环境x86

直接看效果图

1.主页面

C# 实现电子签名,c#,开发语言

2.我们先看手写的方式:

C# 实现电子签名,c#,开发语言

点击确认就到主界面,如下 :

C# 实现电子签名,c#,开发语言

点击自动适配-,再点击生成:

C# 实现电子签名,c#,开发语言

放大看

 C# 实现电子签名,c#,开发语言

点击保存即可,生成透明电子签名图片。

3.在单色背景下手写名字,导入图片生成

先点击 选择图像 按钮,然后选择图像,点击自动适配,点击Canny算法生成,最后点击生成,如下:

C# 实现电子签名,c#,开发语言

双击右边第一张放大:

C# 实现电子签名,c#,开发语言

选择需要的区域点击保存即可。

4.算法介绍:

4.1自动适配

自动适配指根据灰度值像素选取Canny算子的上下阈值,主要目的是能快速自动适配Canny上下阈值,这里主要介绍以中位数或者平均值,然后以Sigma为临界值选取一个区间,如下:

        /// <summary>
        /// 自动适配
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null)
            {
                MessageBox.Show("请选择图像");
                return;
            }
            imgShow?.Dispose();
            gray?.Dispose();

            imgShow = new Image<Bgra, byte>(new Bitmap(pictureBox1.Image));
            gray = imgShow.Convert<Gray, byte>();

            double median = radioButton1.Checked ? CalculateMedian(gray) : CalculateAvg(gray);

            double sigma = (float)numericUpDown1.Value;
            double lower = Math.Max(0, (1.0 - sigma) * median);
            double upper = Math.Min(255, (1.0 + sigma) * median);
            trackBar1.Value = (int)lower;
            label1.Text = trackBar1.Value.ToString();
            trackBar2.Value = (int)upper;
            label3.Text = trackBar2.Value.ToString();
        }

 4.2Canny生成

Canny算子边缘检测具体不多介绍,这里目的是为了找到字体边缘,然后在图像上填充,方便我们能确定这个边缘是否能够准确找到,如果大都填充到字体上,说明边缘检测不错,找到这些边缘,然后计算它们的平均R、G、B:

        /// <summary>
        /// Canny生成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button6_Click(object sender, EventArgs e)
        {
            if (gray == null || imgShow == null)
            {
                MessageBox.Show("请先选择自动适配");
                return;
            }
            // Canny算子边缘检测
            using Image<Gray, byte> edges = gray.Canny(trackBar1.Value, trackBar2.Value);
            using VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
            using Mat hier = new Mat();

            CvInvoke.FindContours(edges, contours, hier, RetrType.List, ChainApproxMethod.ChainApproxSimple);
            // 掩码
            using Image<Gray, byte> mask = new Image<Gray, byte>(gray.Size);
            if (contours.Size > 10000)
            {
                MessageBox.Show("边缘太多,会非常耗时,请重先调节参数");
                return;
            }
            // 在imgShow图像上填充边缘边框
            for (int i = 0; i < contours.Size; i++)
            {
                var contour = contours[i];
                CvInvoke.DrawContours(imgShow, contours, i, new MCvScalar(0, 0, 255), 2);
                CvInvoke.DrawContours(mask, contours, i, new MCvScalar(255), thickness: -1);
            }
            this.pictureBox3.Image?.Dispose();
            this.pictureBox3.Image = imgShow.Bitmap;

            using Image<Gray, byte> maskedImage = new Image<Gray, byte>(gray.Size);
            CvInvoke.BitwiseAnd(gray, gray, maskedImage, mask);
            MCvScalar average = CvInvoke.Mean(maskedImage, mask);
            double blue = average.V0;
            double green = average.V1;
            double red = average.V2;
            trackBar3.Value = (int)Math.Round(red, 0);
            trackBar4.Value = (int)Math.Round(green, 0);
            trackBar5.Value = (int)Math.Round(blue, 0);
            label9.Text = trackBar3.Value.ToString();
            label10.Text = trackBar4.Value.ToString();
            label12.Text = trackBar5.Value.ToString();
        }

4.3生成

在生成中,我们会根据R、G、B计算出掩码,然后将掩码中选取的颜色的alpha通道设置为0,即为透明。

        /// <summary>
        /// 生成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null)
            {
                MessageBox.Show("请选择图片");
                return;
            }
            img?.Dispose();
            img = new Image<Bgra, byte>(new Bitmap(pictureBox1.Image));

            // 掩码
            using Image<Gray, byte> mask2 = img.InRange(new Bgra(trackBar5.Value, trackBar4.Value, trackBar3.Value, 0), new Bgra(255, 255, 255, 255));
            // 将掩码中选取的颜色的alpha通道设置为0
            img.SetValue(new Bgra(0, 0, 0, 0), mask2);


            this.pictureBox2.Image?.Dispose();
            this.pictureBox2.Image = img.Bitmap;
        }

5.也可以直接调用GrabCut方法,多迭代几次就可以,不过效率低

C# 实现电子签名,c#,开发语言

C# 实现电子签名,c#,开发语言 

 private void button2_Click(object sender, EventArgs e)
        {
            if(this.pictureBox1.Image==null)
            {
                return;
            }
            float scaleX = (float)this.pictureBox1.Image.Width / pictureBox1.Width;
            float scaleY = (float)this.pictureBox1.Image.Height / pictureBox1.Height;

            Rectangle rect = new Rectangle(
                (int)(Rect.Left * scaleX),
                (int)(Rect.Top * scaleY),
                (int)(Rect.Width * scaleX),
                (int)(Rect.Height * scaleY));
            var rectangle = new OpenCvSharp.Rect(rect.X, rect.Y, rect.Width, rect.Height);

            rect.Intersect(new Rectangle(0, 0, this.pictureBox1.Image.Width, this.pictureBox1.Image.Height));

            using Mat nimage = new Bitmap(this.pictureBox1.Image).ToMat();
            using Mat image = new Mat(nimage, rectangle);
            using Mat convertedImage = new Mat();
            Cv2.CvtColor(image, convertedImage, ColorConversionCodes.BGRA2BGR); // 将图像转换为CV_8UC3类型
           

            using Mat mask = new Mat(convertedImage.Size(), MatType.CV_8UC1, Scalar.Black);
            using Mat bgdModel = new Mat();
            using Mat fgdModel = new Mat();

            var r = new OpenCvSharp.Rect(0, 0, rectangle.Width-10, rectangle.Height-10);
            Cv2.GrabCut(convertedImage, mask, r, bgdModel, fgdModel, 20, GrabCutModes.InitWithRect);
            Cv2.Threshold(mask, mask, 2, 255, ThresholdTypes.Binary);
            using Mat foreground = new Mat();
            Cv2.BitwiseAnd(convertedImage, convertedImage, foreground, mask);


            // 创建一个具有 alpha 通道的新图像
            using Mat result = new Mat();
            Cv2.CvtColor(image, result, ColorConversionCodes.BGRA2BGR);
            Cv2.Rectangle(result, rectangle, new Scalar(0, 0, 0), 1); // 绘制矩形边界
            Cv2.Multiply(result, new Scalar(1, 1, 1, 0), result); // 将背景部分置为透明

            // 将前景部分复制到结果图像中
            image.CopyTo(result, mask);

            pictureBox2.Image?.Dispose();
            pictureBox2.Image = result.ToBitmap();
            image.Dispose();
        }
       

注:如果需要其它源码,请留言邮箱,我看到私发。文章来源地址https://www.toymoban.com/news/detail-696679.html

到了这里,关于C# 实现电子签名的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue2,实现电子签名(web、移动端)功能

    一、简述 现如今,电子签名与手写签名一样具有法律效应。越来越多的项目开发中会有电子签名的需求,自己最近的项目也会频繁出现该需求。一般开发时会用到现有的 npm 依赖包 vue-signature-pad ,但是自己所处的开发环境不能连接外网,所以打算自己研究和总结实现电子签名

    2024年02月19日
    浏览(22)
  • uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

    实现了在uniapp项目中,微信小程序平台流畅的写字签名板(也可以绘图)功能源码,复制粘贴,改改样式几分钟即可搞定! 支持自动横屏、持预览,真机运行测试非常流畅不卡顿。 如下代码所示。

    2024年02月16日
    浏览(121)
  • uni-app 微信小程序中如何通过 canvas 画布实现电子签名?

    一、实际应用场景 电子签名软件应用场景:电子签名在金融、银行、贷款行业中可以用于对内日常办公流转的文档的盖章签字,对外涉及业务合作协议,采购合同,贷款申请、信用评估、贷款合同、贷款文件表、说明函等等。 可以说,只要是涉及纸质文档签字盖章的场景,

    2024年02月10日
    浏览(34)
  • C#实现SM2签名(对接医保接口注意事项)

    最近在做对接医保接口的项目,入参要求进行SM2签名(注意:是签名而非加密,开始理解成加密研究了一堆加密源码,使用提供的私钥也会报错,后面才发现SM2有专门的签名方法,而接口调用签名也就是 SM2签名 而非加密) 下面是说明适用于2022年云南省医保平台相关项目:

    2024年02月15日
    浏览(38)
  • C# 结合JavaScript实现手写板签名并上传到服务器

    我们最近开发了一款笔迹测试功能的程序(测试版),用户在手写板上手写签名,提交后即可测试出被测试者的心理素质评价分析。类似功能的场景还比如,在银行柜台办理业务,期间可能需要您使用手写设备进行签名并确认;保险续期小程序,到期后需要你在确认续期条款

    2024年04月29日
    浏览(30)
  • c# .net framework 实现微信支付v3 h5支付 签名 验签

    接口文档:微信支付-开发者文档 (qq.com)    遇到的问题有   1、签名老验证不过去 :      生成的签名老验证不过    n 不要加转义符   2、 发送的请求老是400  使用工具请求正常。代码不行。   UserAgent = \\\"m.cnblogs.com/WebRequest\\\";    不要留空就行 网址可填自己的

    2024年02月05日
    浏览(32)
  • 电子签和电子签名法解读

    随着互联网和信息技术的快速发展,越来越多的业务和合同签订过程逐渐转向线上。在这一过程中,电子签和电子签名法成为了人们关注的焦点。本文将对电子签和电子签名法进行解读,探讨它们在现实生活中的应用和意义。 一、电子签和电子签名法的背景和意义 电子签和

    2024年02月10日
    浏览(39)
  • 几百本常用计算机开发语言电子书链接

    GitHub - XiangLinPro/IT_book: 本项目收藏这些年来看过或者听过的一些不错的常用的上千本书籍,没准你想找的书就在这里呢,包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列(常用深度学习框架TensorFlow、pytorch、keras。NLP、机器学习,深度学习等等),大数据系

    2024年02月15日
    浏览(24)
  • 微信小程序电子签名组件

    微信小程序电子签名组件,封装抽离可复用,签名成功输出base64和临时文件路径,解决vant弹窗中使用导致背景滚动问题,宽度自适应,高度设置百分比,开箱即用! 。 小程序根目录创建components文件夹,签名组件放在这个文件夹下,components文件夹下新建signature目录, 代码如下

    2024年02月16日
    浏览(34)
  • 电子签名生成的图片为空白,以及生成透明底签名图片转为白色底

    电子签名如何解决生成的图片为空白的问题,以及生成透明底签名图片转为白色底 一、生成的图片为空白 项目有个新需求需要加电子签名,在实现的过程中遇到了许多问题,现用的插件笔画延迟非常严重,好不容易做完之后又得换一个插件;换了之后又发现画完图后产生的

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包