最近做一个指纹采集和比对的功能,因为公司整个项目是WEB类型的,所以指纹采集的模块要嵌套在网页中,那只有用ActiveX了,以下是一些操作及效果,做个笔记!
新建用户控件,编写CS代码,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
namespace FingerTool
{
[Guid( "5136CBA1-59B0-4A96-B2DC-64062A81F377" )]
public partial class FingerToolUC : UserControl,IObjectSafety
{
public FingerToolUC()
{
InitializeComponent();
}
FrmMain fm = null ;
public void ShowSettingForm()
{
if (fm == null )
{
fm = new FrmMain();
}
fm.ShowDialog();
}
#region 调用JS接口
[ComImport, Guid( "00000118-0000-0000-C000-000000000046" ), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleClientSite
{
void SaveObject();
void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk);
void GetContainer(out IOleContainer ppContainer);
void ShowObject();
void OnShowWindow(bool fShow);
void RequestNewObjectLayout();
}
[ComImport, Guid( "0000011B-0000-0000-C000-000000000046" ), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleContainer
{
void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags,
[Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum);
void ParseDisplayName([In, MarshalAs(UnmanagedType.Interface)] object pbc,
[In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName,
[Out, MarshalAs(UnmanagedType.LPArray)] int [] pchEaten,
[Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut);
void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock);
}
#endregion
#region IE 安全接口
private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}" ;
private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}" ;
private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}" ;
private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}" ;
private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}" ;
private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001 ;
private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002 ;
private const int S_OK = 0 ;
private const int E_FAIL = unchecked(( int ) 0x80004005 );
private const int E_NOINTERFACE = unchecked(( int ) 0x80004002 );
private bool _fSafeForScripting = true ;
private bool _fSafeForInitializing = true ;
public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
{
int Rslt = E_FAIL;
string strGUID = riid.ToString( "B" );
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
Rslt = S_OK;
pdwEnabledOptions = 0 ;
if (_fSafeForScripting == true )
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
break ;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
Rslt = S_OK;
pdwEnabledOptions = 0 ;
if (_fSafeForInitializing == true )
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
break ;
default :
Rslt = E_NOINTERFACE;
break ;
}
return Rslt;
}
|
指纹采集关键代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
private void axZKFPEngX1_OnImageReceived(object sender, AxZKFPEngXControl.IZKFPEngXEvents_OnImageReceivedEvent e)
{
if (!e.aImageValid) return ;
if (axZKFPEngX1.IsDisposed) return ;
try
{
if (pictureBox1.Image != null )
{
pictureBox1.Image.Dispose(); //释放文件资源
pictureBox1.Image = null ; //清除图片
}
if (!System.IO.Directory.Exists(mvPath))
{
System.IO.Directory.CreateDirectory(mvPath);
}
string FilePath = mvPath + "\\" + Guid.NewGuid().ToString() + ".bmp" ;
axZKFPEngX1.SaveBitmap(FilePath); //保存新文件
pictureBox1.Image = System.Drawing.Bitmap.FromFile(FilePath); //显示图片
pictureBox1.Refresh();
if ( this .txtValue.Text.Trim() != "" )
{
SetMsg( "" , "Control" );
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void axZKFPEngX1_OnFeatureInfo(object sender, AxZKFPEngXControl.IZKFPEngXEvents_OnFeatureInfoEvent e)
{
string sTemp = "" ;
if (axZKFPEngX1.IsRegister)
{
sTemp = "登记状态:还需要按压:" + (axZKFPEngX1.EnrollIndex - 1 ).ToString() + "次指纹 " ;
}
sTemp = sTemp + "指纹质量" ;
if (e.aQuality != 0 )
{
if (e.aQuality == 1 )
{
sTemp = sTemp + "特征点不够" ;
}
else
{
sTemp = sTemp + "其它原因导致不能取到指纹特征" ;
}
}
else
{
sTemp = sTemp + "合格" ;
}
this .lblMessage.Text = sTemp;
}
|
指纹校验部分,最后保存起来的指纹是转换之后的BASE64字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
string Value_Old= "" ; //已经登记的指纹
string Value_Curr= "" ; //当前的指纹
bool IsOK = false ;
bool bRegChange = false ;
if (axZKFPEngX1.VerFingerFromStr(ref Value_Old, Value_Curr, false , ref bRegChange))
{
IsOK = true ;
}
if (axZKFPEngX1.VerFingerFromStr(ref Value_Old2, Value_Curr, false , ref bRegChange))
{
IsOK = true ;
}
if (IsOK)
{
MessageBox.Show( "OK" );
}
else
{
MessageBox.Show( "NG" );
}
|
设置项目的COM属性
在页面中注册此插件
采集指纹的次数可以自定义,默认为采集三次之后保存,设备是中控的采集器。
参考页面:http://qingqingquege.cnblogs.com/p/5933752.html
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有