使用C#校驗(yàn)畫(huà)布簽名圖片是否為空白
需求分析
我的文章《C# WinForm實(shí)現(xiàn)畫(huà)筆簽名及解決MemoryBmp格式問(wèn)題》主要介紹如何通過(guò) C# WinForm 通過(guò)畫(huà)布畫(huà)筆實(shí)現(xiàn)手寫(xiě)簽名,簽名后的圖片將根據(jù)需要保存在數(shù)據(jù)庫(kù)中,現(xiàn)有一需求,即判斷用戶是否在畫(huà)布上進(jìn)行了簽名,是否有值。我們可以通過(guò)如下方法進(jìn)行判斷或聯(lián)合判斷:
(1)對(duì)生成的目標(biāo)圖片進(jìn)行像素顏色值判斷,是否為純白色的圖片(應(yīng)用程序默認(rèn)的畫(huà)布即為純白色背景圖片),如果有一個(gè)像素不是純白色即為有值。
(2)在應(yīng)用生成的默認(rèn)目標(biāo)圖片,如果未簽名的話,樣例輸出為6K字節(jié)大小,我們將以此為基準(zhǔn)判斷簽名后的合理字節(jié)大小值,如下圖:
通過(guò)合理樣例統(tǒng)計(jì),簽過(guò)名的圖片大小基本在10K字節(jié)以上,因此通過(guò)簡(jiǎn)單的大小比對(duì)方式也可以判斷圖片中是否有值(簽名)。
(3)通過(guò) PaddleOCRSharp 庫(kù)對(duì)生成的目標(biāo)圖片進(jìn)行文字識(shí)別,如果能夠提取到文字,則也可以判斷圖片中是否有值(簽名)。
開(kāi)發(fā)運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
手寫(xiě)觸屏設(shè)備:Microsoft Surface Pro 9
.net版本: .netFramework4.7.2
開(kāi)發(fā)工具:VS2019 C#
實(shí)現(xiàn)
假設(shè)有目標(biāo)生成圖片地址為 d:\white1.jpg
像素值判斷法
示例代碼如下:
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();
讀取目標(biāo)圖片,遍歷每一個(gè)像素值,如果某一個(gè)像素不是純白色,即退出循環(huán)。
文件大小判斷法
示例代碼如下:
FileInfo fileInfo = new FileInfo("d:\\white1.jpg"); long fileSize = fileInfo.Length; if(fileSize<10000) MessageBox.Show("未簽名");
OCR識(shí)別法
可參閱我的文章 《C# 關(guān)于 PaddleOCRSharp OCR識(shí)別的疲勞測(cè)試》,示例代碼如下:
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;// 預(yù)測(cè)并發(fā)線程數(shù) oCRParameter.enable_mkldnn = false; // web部署該值建議設(shè)置為0,否則出錯(cuò),內(nèi)存如果使用很大,建議該值也設(shè)置為0. oCRParameter.cls = false; // 是否執(zhí)行文字方向分類(lèi);默認(rèn)false oCRParameter.use_angle_cls = false; // 是否開(kāi)啟方向檢測(cè),用于檢測(cè)識(shí)別180旋轉(zhuǎn) oCRParameter.det_db_score_mode = false; // 是否使用多段線,即文字區(qū)域是用多段線還是用矩形 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("未識(shí)別出文字");
小結(jié)
本示例是結(jié)合應(yīng)用實(shí)例的舉例,判斷圖片是否有值或簽名,可能需要聯(lián)合判斷或按照您實(shí)際的情況進(jìn)行應(yīng)用開(kāi)發(fā),如基礎(chǔ)空白圖片的特質(zhì),大小等。
到此這篇關(guān)于使用C#校驗(yàn)畫(huà)布簽名圖片是否為空白的文章就介紹到這了,更多相關(guān)C#校驗(yàn)畫(huà)布簽名是否空白內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#多線程編程中導(dǎo)致死鎖的常見(jiàn)陷阱和避免方法
在C#多線程編程中,死鎖(Deadlock)是一種常見(jiàn)的、令人頭疼的錯(cuò)誤,死鎖通常發(fā)生在多個(gè)線程試圖獲取多個(gè)資源的鎖時(shí),導(dǎo)致相互等待對(duì)方釋放資源,最終形成一個(gè)循環(huán)依賴,造成程序無(wú)法繼續(xù)執(zhí)行,本文將深入探討C#多線程編程中導(dǎo)致死鎖的常見(jiàn)陷阱,并幫助你避免這些坑2025-02-02C#生成設(shè)置范圍內(nèi)的Double類(lèi)型隨機(jī)數(shù)的方法
這篇文章主要介紹了C#生成設(shè)置范圍內(nèi)的Double類(lèi)型隨機(jī)數(shù)的方法,對(duì)于C#的初學(xué)者有很好的借鑒價(jià)值,需要的朋友可以參考下2014-08-08C#子類(lèi)對(duì)基類(lèi)方法的繼承、重寫(xiě)與隱藏詳解
這篇文章主要介紹了C#子類(lèi)對(duì)基類(lèi)方法的繼承、重寫(xiě)與隱藏的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07C#中txt數(shù)據(jù)寫(xiě)入的幾種常見(jiàn)方法
這篇文章主要給大家介紹了關(guān)于C#中txt數(shù)據(jù)寫(xiě)入的幾種常見(jiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10