C#校验画布签名图片是否为空白

目录

需求分析

开发运行环境

实现

像素值判断法

文件大小判断法

OCR识别法

小结


需求分析

我的文章《C# WinForm实现画笔签名及解决MemoryBmp格式问题》主要介绍如何通过 C# WinForm 通过画布画笔实现手写签名,签名后的图片将根据需要保存在数据库中,现有一需求,即判断用户是否在画布上进行了签名,是否有值。我们可以通过如下方法进行判断或联合判断:

(1)对生成的目标图片进行像素颜色值判断,是否为纯白色图片(应用程序默认的画布即为纯白色背景图片),如果有一个像素不是纯白色即为有值。

(2)在应用生成的默认目标图片,如果未签名的话,样例输出为6K字节大小,我们将以此为基准判断签名后的合理字节大小值,如下图:

通过合理样例统计,签过名的图片大小基本在10K字节以上,因此通过简单的大小比对方式也可以判断图片中是否有值(签名)。

(3)通过 PaddleOCRSharp 库对生成的目标图片进行文字识别,如果能够提取到文字,则也可以判断图片中是否有值(签名)。

开发运行环境

操作系统: Windows Server 2019 DataCenter

手写触屏设备:Microsoft Surface Pro 9

.net版本: .netFramework4.7.2

开发工具:VS2019 C#

实现

假设有目标生成图片地址为 d:\white1.jpg

像素值判断法

示例代码如下:

cs 复制代码
System.Drawing.Bitmap validImage = new System.Drawing.Bitmap("d:\\white1.jpg");
bool isWhite = true;
for (int x = 0; x < validImage.Width; x++)
{
     for (int y = 0; y < validImage.Height; y++)
     {
          System.Drawing.Color color = validImage.GetPixel(x, y);
          if (color.R != 255||color.G!=255||color.B!=255)
          {
              isWhite = false;
              break;
          }
     }
     if (isWhite == false)
     {
         break;
     }

}
MessageBox.Show(isWhite.ToString());
validImage.Dispose();

读取目标图片,遍历每一个像素值,如果某一个像素不是纯白色,即退出循环。

文件大小判断法

示例代码如下:

cs 复制代码
FileInfo fileInfo = new FileInfo("d:\\white1.jpg");
long fileSize = fileInfo.Length;
if(fileSize<10000)
MessageBox.Show("未签名");

OCR识别法

可参阅我的文章 《C# 关于 PaddleOCRSharp OCR识别的疲劳测试》,示例代码如下:

cs 复制代码
OCRModelConfig config = null;
OCRParameter oCRParameter = new OCRParameter();
PaddleOCREngine engi = null;
OCRResult ocrResult = new OCRResult();
var imagebyte = File.ReadAllBytes("d:\\white1.jpg");

    oCRParameter.cpu_math_library_num_threads = 10;// 预测并发线程数
    oCRParameter.enable_mkldnn = false; // web部署该值建议设置为0,否则出错,内存如果使用很大,建议该值也设置为0.
    oCRParameter.cls = false; // 是否执行文字方向分类;默认false
    oCRParameter.use_angle_cls = false; // 是否开启方向检测,用于检测识别180旋转
    oCRParameter.det_db_score_mode = false; // 是否使用多段线,即文字区域是用多段线还是用矩形
    oCRParameter.det_db_unclip_ratio = 1.6f;
            
engi = new PaddleOCREngine(config, oCRParameter);

ocrResult = engi.DetectText(imagebyte);
string ocrText="";
if (ocrResult != null)
{
   ocrText=ocrResult.Text;
}
if(ocrText=="")
   MessageBox.Show("未识别出文字");

小结

本示例是结合应用实例的举例,判断图片是否有值或签名,可能需要联合判断或按照您实际的情况进行应用开发,如基础空白图片的特质,大小等。

感谢您的阅读,希望本文能够对您有所帮助。

相关推荐
运器12320 分钟前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
whoarethenext36 分钟前
使用 C++ 实现 MFCC 特征提取与说话人识别系统
开发语言·c++·语音识别·mfcc
ITfeib1 小时前
Flutter
开发语言·javascript·flutter
ChaITSimpleLove1 小时前
.NET9 实现排序算法(MergeSortTest 和 QuickSortTest)性能测试
算法·排序算法·.net·benchmarkdotnet·datadog.trace
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
Owen_Q2 小时前
Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
开发语言·算法·职场和发展
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
liulilittle2 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++
Thomas_YXQ3 小时前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
Zz_waiting.3 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象