using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Helper
{
public class CV300EHelper
{
#region 指纹特征提取函数接口
/// <summary>
/// 版本信息获取
/// 函数原型:int __stdcall FP_GetVersion(unsigned char code[4])
/// </summary>
/// <param name="code">unsigned char code[4] 版本信息格式为XXYY,XX为开发者代码,YY为版本号。如“1201” 则code的填写方式为:,code[0]=‘1’ code[1]=,‘2’ code[3]=,‘0’ code[4]=,‘1’。输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求。输出参数。</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_GetVersion", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_GetVersion(System.IntPtr code);
/// <summary>
/// 初始化操作
/// 函数原型:int __stdcall FP_Begin()
/// </summary>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 B.4 的要求。</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_Begin", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_Begin();
/// <summary>
/// 指纹图像特征提取
/// 函数原型:int __stdcall FP_FeatureExtract(unsigned char cScannerType,unsigned char cFingerCode,unsigned char * pFingerImgBuf,unsigned char * pFeatureData)
/// </summary>
/// <param name="cScannerType">unsigned char cScannerType 指纹采集器代码。输入参数。</param>
/// <param name="cFingerCode">unsigned char cFingerCode 指位代码。输入参数。</param>
/// <param name="pFingerImgBuf">unsigned char * pFingerImgBuf 指纹图像数据指针,指纹图像为RAW格式。输入参数。</param>
/// <param name="pFeatureData">unsigned char * pFeatureData 指纹特征数据指针,存储生成的指纹特征数据,由调用者分配内存空间,输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_FeatureExtract", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_FeatureExtract(byte cScannerType, byte cFingerCode, System.IntPtr pFingerImgBuf, System.IntPtr pFeatureData);
/// <summary>
/// 指纹图像数据与指纹特征数据比对
/// 函数原型:int __stdcall FP_FeatureMatch(unsigned char * pFeatureData1,unsigned char* pFeatureData2,float * pfSimilarity)
/// 对两个指纹特征数据进行比对,得到相似度值
/// </summary>
/// <param name="pFeatureData1">unsigned char * pFeatureData1 指纹特征数据指针1。输入参数。</param>
/// <param name="pFeatureData2">unsigned char * pFeatureData2 指纹特征数据指针2。输入参数。</param>
/// <param name="pfSimilarity">float * pfSimilarity 相似度,取值范围为0.00 ~ 1.00,值0.00表示不匹配,值1.00 表示完全匹配。输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_FeatureMatch", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_FeatureMatch(System.IntPtr pFeatureData1, System.IntPtr pFeatureData2, ref float pfSimilarity);
/// <summary>
/// 指纹图像数据与指纹特征数据比对
/// 函数原型:int __stdcall FP_ImageMatch(unsigned char * pFingerImgBuf,unsigned char *pFeatureData,float * pfSimilarity)。
/// 对指纹图像数据与指纹特征数据进行比对,得到相似度值。
/// </summary>
/// <param name="pFingerImgBuf">unsigned char * pFingerImgBuf 指纹图像数据指针,指纹图像为RAW格式。输入参数。</param>
/// <param name="pFeatureData">unsigned char * pFeatureData 指纹特征数据指针。输入参数。</param>
/// <param name="pfSimilarity">float * pfSimilarity 相似度,取值范围为0.00 ~ 1.00,值0.00表示不匹配,值1.00 表示完全匹配。输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_ImageMatch", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_ImageMatch(System.IntPtr pFingerImgBuf, System.IntPtr pFeatureData, ref float pfSimilarity);
/// <summary>
/// 指纹图像数据压缩
/// 函数原型:int __stdcall FP_Compress(unsigned char cScannerType, unsigned char cEnrolResult,unsigned char cFingerCode, unsigned char* pFingerImgBuf,int nCompressRatio, unsigned char* pCompressedImgBuf, unsigned char strBuf[256])。
/// 对指纹图像数据进行压缩。
/// </summary>
/// <param name="cScannerType">unsigned char cScannerType 指纹采集器代码。输入参数。</param>
/// <param name="cEnrolResult">unsigned char cEnrolResult 注册结果代码。输入参数。</param>
/// <param name="cFingerCode">unsigned char cFingerCode 指位代码。输入参数。</param>
/// <param name="pFingerImgBuf">unsigned char * pFingerImgBuf 指纹图像数据指针,指纹图像为RAW格式。输入参数。</param>
/// <param name="nCompressRatio">int nCompressRatio 指纹图像数据压缩倍数。输入参数。</param>
/// <param name="pCompressedImgBuf">unsigned char * pCompressedImgBuf 指纹压缩图像数据指针,调用者在调用此函数前,应当分配不小于20 480字节的内存,指纹压缩图像数据文件结构应符合附录A要求。输出参数。</param>
/// <param name="strBuf">unsigned char strBuf[256] 错误信息,如果压缩图像发生错误,并且返回值为-9的情况下,strBuf填写错误信息。错误信息为以数值0结尾的字符串,采用GB 13000中规定的字符。输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求。</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_Compress", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_Compress(byte cScannerType, byte cEnrolResult, byte cFingerCode, System.IntPtr pFingerImgBuf,
int nCompressRatio, System.IntPtr pCompressedImgBuf, byte[] strBuf);
/// <summary>
/// 指纹图像数据复现
/// 函数原型:int __stdcall FP_Decompress(unsigned char * pCompressedImgBuf,unsigned char* pFingerImgBuf,unsigned char strBuf[256])。
/// 对指纹原始图像数据进行复现。
/// </summary>
/// <param name="pCompressedImgBuf">unsigned char * pCompressedImgBuf 指纹压缩图像数据指针,压缩图像数据长度不大 于20 480字节。输入参数。</param>
/// <param name="pFingerImgBuf">unsigned char * pFingerImgBuf 指纹复现图像数据指针,指纹图像为RAW格式,调用者在调用此函数前,应当分配92 160字节的内存。输出参数。</param>
/// <param name="strBuf">unsigned char strBuf[256] 错误信息,如果压缩图像发生错误,并且返回值为-9的情况下,strBuf填写错误信息。错误信息为以数值0结尾的字符串,采用GB 13000中规定的 字符。输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_Decompress", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_Decompress(System.IntPtr pCompressedImgBuf, System.IntPtr pFingerImgBuf, byte[] strBuf);
/// <summary>
/// 指纹图像质量值获取
/// 函数原型:int __stdcall FP_GetQualityScore(unsigned char * pFingerImgBuf,unsigned char* pnScore)。
/// 获取指纹图像的质量值
/// </summary>
/// <param name="pFingerImgBuf">unsigned char * pFingerImgBuf 指纹图像数据指针,指纹图像为RAW格式。输入参数。</param>
/// <param name="pnScore">unsigned char * pnScore 指纹图像质量值指针,指纹图像质量值取值范围为00H ~ 64H,值01H表示最低质量,值64H表示最高质量,值00H表示未知。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求。</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_GetQualityScore", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_GetQualityScore(System.IntPtr pFingerImgBuf, ref int pnScore);
/// <summary>
/// 生成“注册失败”指纹特征数据
/// 函数原型:int __stdcall FP_GenFeatureFromEmpty1(unsigned char cScannerType,unsigned char cFingerCode,unsigned char * pFeatureData)
/// 本函数针对“注册失败”手指的情况,生成“注册失败”指纹特征数据。其中,字段5设置为02H;字段9、字段10均设置为00H。
/// </summary>
/// <param name="cScannerType">unsigned char cScannerType 指纹采集器代码。输入参数。</param>
/// <param name="cFingerCode">unsigned char cFingerCode 指位代码。输入参数。</param>
/// <param name="pFeatureData">unsigned char * pFeatureData 指纹特征数据指针,存储生成的指纹特征数据,由调用者分配内存空间,输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_GenFeatureFromEmpty1", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_GenFeatureFromEmpty1(byte cScannerType, byte cFingerCode, System.IntPtr pFeatureData);
/// <summary>
/// 生成“未注册”指纹特征数据
/// 函数原型:int __stdcall FP_GenFeatureFromEmpty2(unsigned char cFingerCode,unsigned char * pFeatureData)
/// 本函数针对“未注册”手指的情况,生成“未注册”指纹特征数据。其中,字段5设置为03H;字段6设置为61H、62H或63H;字段7、字段9、字段10均设置为00H。
/// </summary>
/// <param name="cFingerCode">unsigned char cFingerCode 指位代码。输入参数。</param>
/// <param name="pFeatureData">unsigned char * pFeatureData 指纹特征数据指针,存储生成的指纹特征数据,由调用者分配内存空间,输出参数。</param>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求。</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_GenFeatureFromEmpty2", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_Decompress(byte cFingerCode, System.IntPtr pFeatureData);
/// <summary>
/// 结束操作
/// 函数原型:int __stdcall FP_End()
/// </summary>
/// <returns>调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求。</returns>
[DllImport("ID_Fpr.dll", EntryPoint = "FP_End", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int FP_End();
#endregion
#region 指纹仪函数接口
/// <summary>
/// 初始化采集器
/// 函数原型:int _stdcall LIVESCAN_Init()。
/// 初始化采集器,分配相应的资源。
/// 在所有接口函数中,通常首先调用此函数。只需要调用一次,允许重复调用,其结果与一次调用相同。
/// </summary>
/// <returns>调用成功返回1。否则返回错误代码,调用LIVESCAN_GetErrInfo函数获取错误信息。错误代码值符合A.4的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_Init", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_Init();
/// <summary>
/// 释放采集器
/// 函数原型:int _stdcall LIVESCAN_Close()。
/// 关闭指纹采集器,释放分配的资源。
/// 调用此函数后,在没有调用 LIVESCAN_Init 函数之前,仅可调用 LIVESCAN_GetVersion、LIVESCAN_GetDesc 和 LIVESCAN_GetErrorInfo 函数。
/// 调用此函数后,应重新调用 LIVESCAN_Init 来初始化采集器。
/// </summary>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_Close", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_Close();
/// <summary>
/// 获得采集器通道数量
/// 函数原型:int _stdcall LIVESCAN_GetChannelCount()。
/// 获得采集器可以使用的通道数量及通道号。
/// </summary>
/// <returns>调用成功返回通道数量(>0)。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetChannelCount", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetChannelCount();
/// <summary>
/// 获得采集器采集图像的宽度、高度的最大值
/// 函数原型:int _stdcall LIVESCAN_GetMaxImageSize(int nChannel,int * pnWidth, int * pnHeight)。
/// 获得采集器可采集图像的宽度、高度的最大值。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <param name="pnWidth">int * pnWidth 存放图像宽度的整形指针。输出参数。</param>
/// <param name="pnHeight">int * pnHeight 存放图像高度的整形指针。输出参数。</param>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetMaxImageSize", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetMaxImageSize(int nChannel, ref int pnWidth, ref int pnHeight);
/// <summary>
/// 获得采集器当前的亮度
/// 函数原型:int _stdcall LIVESCAN_GetBright(int nChannel,int * pnBright)。
/// 获得采集器当前亮度。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <param name="pnBright">int * pnBright 存放当前亮度的整形指针。输出参数。</param>
/// <returns>调用成功返回 1。否则返回错误代码 ,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetBright", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetBright(int nChannel, ref int pnBright);
/// <summary>
/// 设置采集器当前的亮度
/// 函数原型:int _stdcall LIVESCAN_SetBright(int nChannel, int nBright)。
/// 设置采集器当前亮度
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <param name="nBright">int nBright 亮度,范围为 0~255,输入参数。</param>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_SetBright", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_SetBright(int nChannel, int nBright);
/// <summary>
/// 获得采集器当前对比度
/// 函数原型:int _stdcall LIVESCAN_GetContrast(int nChannel,int * pnContrast)。
/// 获得采集器当前对比度。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <param name="pnContrast">int * pnContrast 存放当前对比度的整型指针。输出参数。</param>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetContrast", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetContrast(int nChannel, ref int pnContrast);
/// <summary>
/// 设置采集器当前对比度
/// 函数原型:int _stdcall LIVESCAN_SetContrast(int nChannel,int Contrast)。
/// 设置采集器当前对比度。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <param name="nContrast">int nContrast 对比度, 范围0~255。输入参数。</param>
/// <returns>调用成功返回1。否则返回错误代码,调用LIVESCAN_GetErrInfo函数获取错误信息。错误代码值符合A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_SetContrast", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_SetContrast(int nChannel, int nContrast);
/// <summary>
/// 获得当前图像的采集位置、宽度和高度
/// 函数原型:int _stdcall LIVESCAN_GetCaptWindow(int nChannel,int * pnOriginX, int * pnOriginY,int * pnWidth, int * pnHeight)。
/// 获得采集器当前图像的采集位置、宽度和高度。当前图像宽度初始值为 256,高度初始值为360。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <param name="pnOriginX">int *pnOriginX 存放图像采集窗口的采集原点坐标X值的整型指针。输出参数。</param>
/// <param name="pnOriginY">int *pnOriginY 存放图像采集窗口的采集原点坐标Y值的整型指针。输出参数。</param>
/// <param name="pnWidth">int *pnWidth 存放采集图像宽度的整形指针。输出参数。</param>
/// <param name="pnHeight">int *pnHeight 存放采集图像高度的整形指针。输出参数。</param>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetCaptWindow", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetCaptWindow(int nChannel, ref int pnOriginX, ref int pnOriginY, ref int pnWidth, ref int pnHeight);
/// <summary>
/// 设置当前图像的采集位置、宽度和高度
/// 函数原型:int _stdcall LIVESCAN_SetCaptWindow(int nChannel,int nOriginX, int nOriginY,int nWidth,int nHeight)。
/// 设置采集器当前图像的采集位置、宽度和高度。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <param name="nOriginX">int nOriginX 图像采集窗口的采集原点坐标 X 值。输入参数。</param>
/// <param name="nOriginY">int nOriginY 图像采集窗口的采集原点坐标 Y 值。输入参数。</param>
/// <param name="nWidth">int nWidth 采集图像的宽度。对于居民身份证用单指指纹采集,应大于等于 256。否则应返回参数错误代码。输入参数。</param>
/// <param name="nHeight">int nHeight 采集图像的高度。对于居民身份证用单指指纹采集,应大于等于 360。否则应返回参数错误代码。输入参数。</param>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_SetCaptWindow", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_SetCaptWindow(int nChannel, int nOriginX, int nOriginY, int nWidth, int nHeight);
/// <summary>
/// 准备采集一帧图像
/// 函数原型:int _stdcall LIVESCAN_BeginCapture(int nChannel)。
/// 采集图像的一个前缀函数,使得采集器有机会进行另外一个采集之前的初始化工作。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_BeginCapture", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_BeginCapture(int nChannel);
/// <summary>
/// 结束采集一帧图像
/// 函数原型:int _stdcall LIVESCAN_EndCapture(int nChannel)。
/// 结束采集一帧图像或预览图像。
/// </summary>
/// <param name="nChannel">int nChannel 通道号。输入参数。</param>
/// <returns>调用成功返回1。否则返回错误代码,调用LIVESCAN_GetErrInfo函数获取错误信息。错误代码值符合A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_EndCapture", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_EndCapture(int nChannel);
/// <summary>
/// 采集一帧图像
/// 函数原型:int _stdcall LIVESCAN_GetFPRawData(int nChannel,unsigned char *pRawData)。
/// </summary>
/// <param name="nChannel">int nChannel通道号。输入参数。</param>
/// <param name="pRawData">unsigned char* pRawData指向存放采集数据的内存块,调用者分配。 返回图像数据,大小应为:当前图像采集宽度×当前图像采集高度。输出参数。</param>
/// <returns>调用成功返回1。否则返回错误代码,调用LIVESCAN_GetErrInfo函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetFPRawData", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetFPRawData(int nChannel, System.IntPtr pRawData);
/// <summary>
/// 采集一帧BMP格式图像数据
/// 函数原型:int _stdcall LIVESCAN_GetFPBmpData(int nChannel, unsigned char * pBmpData)。
/// 采集一帧8位灰度 BMP 格式图像。
/// </summary>
/// <param name="nChannel">int nChannel通道号。输入参数。</param>
/// <param name="pBmpData">unsigned char* pBmpData 指向存放8位灰度BMP格式采集数据的内存块,调用者分配。返回8位灰度BMP格式图像数据。大小应为:当前图像采集宽度×当前图像采集高度+1078。输出参数。</param>
/// <returns>调用成功,返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetFPBmpData", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetFPBmpData(int nChannel, System.IntPtr pBmpData);
/// <summary>
/// 调用采集器的属性设置对话框
/// 函数原型:int _stdcall LIVESCAN_Setup()。
/// 此函数弹出一个模式对话框,用户可以设置除去对比度、亮度、采集窗口参数外的其它参数,如GAMMA值等,使得设置适合采集器本身的特点。
/// </summary>
/// <returns>调用成功返回 1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合 A.4 的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_Setup", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_Setup();
/// <summary>
/// 采集器是否支持设置对话框
/// 函数原型:int _stdcall LIVESCAN_IsSupportSetup()。
/// 此函数用来确认是否支持设置对话框。
/// </summary>
/// <returns>若采集接口支持LIVESCAN_setup,则返回1,否则返回0。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合A.4的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_IsSupportSetup", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_IsSupportSetup();
/// <summary>
/// 取得接口规范的版本
/// 函数原型:int ¬_stdcall LIVESCAN_GetVersion()。
/// 获得接口版本号。
/// </summary>
/// <returns>获得接口规范的版本。当前版本为1.00,返回值为100。若以后扩展接口,则需要修改此版本号。否则返回错误代码,调用LIVESCAN_GetErrorInfo函数获取错误信息。错误代码值应符合 A.4的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetVersion", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetVersion();
/// <summary>
/// 获得接口规范的说明
/// 函数原型:int _stdcall LIVESCAN_GetDesc(char pszDesc[1024])。
/// 获得接口说明,不需要初始化就可以调用。pszDesc以数值0结尾的字符串,采用GB13000 中规定的字符。
/// </summary>
/// <param name="pszDesc">char pszDesc[1024]存放接口说明,其中pszDesc[0]用于存储采集器代码,缺省为FFH。 输出参数。</param>
/// <returns>调用成功返回1。否则返回错误代码,调用LIVESCAN_GetErrorInfo函数获取错误信息。错误代码值应符合 A.4的要求</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetDesc", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetDesc(System.IntPtr pszDesc);
/// <summary>
/// 设置存放采集数据的内存块为空
/// 函数原型:int _stdcall LIVESCAN_SetBufferEmpty(unsigned char * pImageData, long imageLength)。
/// 将存放采集数据的内存块中的每一个字节的值置为0x00。
/// </summary>
/// <param name="pImageData">unsigned char * pImageData 指向存放采集数据的内存块。输入参数。</param>
/// <param name="imageLength">long imageLength 存放采集数据的内存块长度。输入参数。</param>
/// <returns>调用成功返回1。否则返回错误代码,调用 LIVESCAN_GetErrInfo 函数获取错误信息。错误代码值符合A.4的要求。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_SetBufferEmpty", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_SetBufferEmpty(System.IntPtr pImageData, long imageLength);
/// <summary>
/// 获得采集接口错误信息
/// 函数原型:int _stdcall LIVESCAN_GetErrorInfo(int nErrorNo,char pszErrorInfo[256])。
/// pszErrorInfo 采用GB13000中规定的字符。
/// </summary>
/// <param name="nErrorNo">char pszErrorInfo[256]用来存放错误信息的内存块,错误信息的长度不能超过 256 个字节。输出参数。</param>
/// <param name="pszErrorInfo">int nErrorNo 错误代码(<0)。输入参数。</param>
/// <returns>若为合法的错误代码返回 1,pszErrorInfo中为错误信息。若 nErrorNo 为非法的错误代码,则返回-6,同时设置 pszErrorInfo为“非法错误号”错误。</returns>
[DllImport("ID_FprCap.dll", EntryPoint = "LIVESCAN_GetErrorInfo", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int LIVESCAN_GetErrorInfo(int nErrorNo, System.IntPtr pszErrorInfo);
[DllImport("Kernel32.dll")]
static extern bool QueryPerformanceCounter(ref long count);
[DllImport("Kernel32.dll")]
static extern bool QueryPerformanceFrequency(ref long count);
#endregion
#region 二代证接口
/// <summary>
/// 初始化连接
/// 原 型:int CVR_InitComm (int Port)
/// 本函数用于PC与华视电子第二代居民身份证阅读器的连接。
/// </summary>
/// <param name="Port">连接串口(COM1~COM16)或USB口(1001~1016)[1,串口1],[2,串口2],[3,串口3],[4,串口4],[1001,USB口1],[1002,USB口2],[1003,USB口3],[1004,USB口4]</param>
/// <returns>[1,正确],[2,端口打开失败],[0,动态库加载失败]</returns>
[DllImport("termb.dll", EntryPoint = "CVR_InitComm", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int CVR_InitComm(int Port);//声明外部的标准动态库, 跟Win32API是一样的
/// <summary>
/// 卡认证
/// 原 型:int CVR_Authenticate (void)
/// 本函数用于读卡器和卡片之间的合法身份确认。卡认证循环间隔大于300ms。
/// </summary>
/// <returns>[值,意义,说明][1,正确,卡片认证成功],[2,错误,寻卡失败],[3,错误,选卡失败],[0,错误,初始化失败]</returns>
[DllImport("termb.dll", EntryPoint = "CVR_Authenticate", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int CVR_Authenticate();
/// <summary>
/// 读卡操作
/// 原 型:int CVR_Read_Content(int active)
/// 本函数用于通过阅读器从第二代居民身份证中读取相应信息。卡认证成功以后才可做读卡操作,读卡完毕若继续读卡应移走二代证卡片重新放置做卡认证。
/// 读卡成功后在termb.dll文件所在路径下生成wz.txt(文字信息)和zp.bmp(照片信息)
/// wz.txt内容示例如下:
/// 张红叶
/// 女
/// 汉
/// 1988-11-18
/// 河北省邯郸市临漳县称勾镇称勾东村复兴路25号
/// 130423198811184328
/// 临漳县公安局
/// 2011.03.30-2021.03.30
/// </summary>
/// <param name="Active">active:兼容以前版本,无实际意义</param>
/// <returns>[1,正确],[2,错误],[99,异常]</returns>
[DllImport("termb.dll", EntryPoint = "CVR_Read_Content", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int CVR_Read_Content(int Active);
/// <summary>
/// 读取文字,照片,指纹,操
/// 原 型:int CVR_Read_FPContent ()
/// 本函数用于通过阅读器从第二代居民身份证中读取相应信息。卡认证成功以后才可做读卡操作,读卡完毕若继续读卡应移走二代证卡片重新放置做卡认证。
/// 读卡成功后在termb.dll文件所在路径下生成wz.txt(文字信息)和zp.bmp(照片信息)
/// wz.txt内容示例如下:
/// 张红叶
/// 女
/// 汉
/// 1988-11-18
/// 河北省邯郸市临漳县称勾镇称勾东村复兴路25号
/// 130423198811184328
/// 临漳县公安局
/// 2011.03.30-2021.03.30
/// </summary>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "CVR_Read_FPContent", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int CVR_Read_FPContent();
/// <summary>
/// 关闭连接
/// 原 型:int CVR_CloseComm(void)
/// </summary>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "CVR_CloseComm", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int CVR_CloseComm();
/// <summary>
/// 得到姓名信息
/// 原 型:int GetPeopleName(char *strTmp, int *strLen)
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetPeopleName", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int GetPeopleName(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到民族信息
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetPeopleNation", CharSet = CharSet.Ansi, SetLastError = false)]
public static extern int GetPeopleNation(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到出生日期
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetPeopleBirthday", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetPeopleBirthday(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到地址信息
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetPeopleAddress", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetPeopleAddress(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到身份证号信息
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetPeopleIDCode", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetPeopleIDCode(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到发证机关信息
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetDepartment", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetDepartment(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到有效开始日期
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetStartDate", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetStartDate(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到有效截止日期
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetEndDate", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetEndDate(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到性别信息
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <param name="strLen">*strLen 返回的信息长度指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetPeopleSex", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetPeopleSex(ref byte strTmp, ref int strLen);
/// <summary>
/// 读取指纹信息
/// 函数原型:int GetFPDate(unsigned char* pucFPMsgValue,int* nlen)
/// 本函数用于通过阅读器从第二代居民身份证中读取指纹信息。CVR_Read_FPContent()调用成功以后才可以调用该函数
/// 以下是指纹信息的相关说明,供调用者参考:
/// 第一枚指纹信息:
/// pucFPMsgValue[0] 字段文件头类型,记录字符“C”(43H)
/// pucFPMsgValue[1] 指纹算法版本号
/// pucFPMsgValue[2] 指纹采集器代码
/// pucFPMsgValue[3] 指纹算法开发者代码
/// pucFPMsgValue[4] 注册结果代码,01H 表示“注册成功”,02H 表示“注册失败”,03H 表示“未注册”,09H 表示“未知”
/// pucFPMsgValue[5] 指位代码 具体见指位说明
/// pucFPMsgValue[6] 指纹质量值,以00H~64H来表示,值01H表示最低质量,值64H表示最高质量,值00H表示“未知”
/// 第二枚指纹信息:
/// pucFPMsgValue[512] 字段文件头类型,记录字符“C”(43H)
/// pucFPMsgValue[513] 指纹算法版本号
/// pucFPMsgValue[514] 指纹采集器代码
/// pucFPMsgValue[515] 指纹算法开发者代码
/// pucFPMsgValue[516] 注册结果代码,01H 表示“注册成功”,02H 表示“注册失败”,03H 表示“未注册”,09H 表示“未知”
/// pucFPMsgValue[517] 指位代码 具体见指位说明
/// pucFPMsgValue[518] 指纹质量值,以00H~64H来表示,值01H表示最低质量,值64H表示最高质量,值00H表示“未知”
/// 指位码说明:[pucFPMsgValue[5or517],指位]
/// [0BH,右手拇指],[0CH,右手食指],[0DH,右手中指],[0EH,右手环指],[0FH,右手小指]
/// [10H,左手拇指],[11H,左手食指],[12H,左手中指],[13H,左手环指],[14H,左手小指]
/// [61H,右手不确定指位],[62H,左手不确定指位],[63H,其他不确定指位]
/// </summary>
/// <param name="strTmp">pucFPMsgValue 存放指纹信息的内存缓冲,大小由调用者分配1024字节大小。</param>
/// <param name="strLen">nlen 指纹数据的大小,传出参数,0 表示没有指纹信息,大于0表示 存在指纹信息。一个指纹信息转占512字节大小,身份证中一般存储两个指纹信息。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetFPDate", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetFPDate(ref byte strTmp, ref int strLen);
/// <summary>
/// 得到安全模块号
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "CVR_GetSAMID", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int CVR_GetSAMID(ref byte strTmp);
/// <summary>
///
/// </summary>
/// <param name="strTmp">*strTmp 返回的信息缓存指针。</param>
/// <returns>[1,正确],[0,错误]</returns>
[DllImport("termb.dll", EntryPoint = "GetManuID", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
public static extern int GetManuID(ref byte strTmp);
#endregion
#region 语音提示接口
/// <summary>
/// 原 型:int SendReport (int nIndex)
/// 本函数用于PC与华视电子第二代居民身份证阅读器的连接。
/// 参数:nIndex
/// [1,请将您的身份证放在读卡区域内],[2,读卡成功],[3,读卡失败请重新放卡]
/// [4,请采集右手拇指指纹],[5,请采集右手无名指指纹],[6,请采集右手中指指纹],[7,请采集右手食指指纹],[8,请采集右手小指指纹]
/// [9,请采集左手拇指指纹],[10,请采集左手食指指纹],[11,请采集左手中指指纹],[12,请采集左手无名指指纹],[13,请采集左手小指指纹]
/// [14,指纹采集成功],[15,指纹对比成功],[16,请面对摄像头],[17,照片采集成功]
/// </summary>
/// <param name="nIndex">。输入参数</param>
/// <returns>[1,正确],[0,失败]</returns>
[DllImport("HIDSENREPORT.dll", EntryPoint = "SendReport", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int CVR_SendReport(int nIndex);
#endregion
#region 整合类
/// <summary>
/// 指纹仪初始化,不初始化算法
/// </summary>
/// <returns>[1,初始化成功],[-1,初始化失败]</returns>
public static int HelperZhiWenChuShiHua()
{
int ret = LIVESCAN_Init();
if (ret == 1)
{
ret = LIVESCAN_BeginCapture(0);
if (ret == 1)
{
return 1;
}
else
return -1;
}
else
return -1;
}
/// <summary>
/// 指纹仪初始化,初始化算法
/// </summary>
/// <returns>[1,初始化成功],[-1,初始化失败]</returns>
public static int HelperZhiWenChuShiHuaAll()
{
int ret = HelperZhiWenChuShiHua();
if (ret == 1)
{
ret = FP_Begin();
if (ret == 1)
return 1;
else
return -1;
}
else
return -1;
}
/// <summary>
/// 初始化读卡器
/// </summary>
/// <returns>[1,初始化成功],[-1,初始化失败]</returns>
public static int HelperIDCardChuShiHua()
{
int iPort, iRetUSB = 0, iRetCOM = 0;
for (iPort = 1001; iPort <= 1004; iPort++)
{
iRetUSB = CVR_InitComm(iPort);
if (iRetUSB == 1)
{
break;
}
}
if (iRetUSB != 1)
{
for (iPort = 1; iPort <= 4; iPort++)
{
iRetCOM = CVR_InitComm(iPort);
if (iRetCOM == 1)
{
break;
}
}
}
if ((iRetCOM == 1) || (iRetUSB == 1))
{
return 1;
}
else
{
return -1;
}
}
/// <summary>
/// 读取身份证
/// </summary>
/// <returns></returns>
public static PeopleBean HelperGetPeopleBean()
{
int authenticate = CVR_Authenticate();
if (authenticate == 1)
{
int readContent = CVR_Read_FPContent();
if (readContent == 1)
{
PeopleBean people = new PeopleBean();
HelperSendReport(EnumSendReport.读卡成功);
byte[] name = new byte[30];
int length = 30;
GetPeopleName(ref name[0], ref length);
people.name = Encoding.GetEncoding("GB2312").GetString(name).Replace("\0", "").Trim();
byte[] number = new byte[36];
length = 36;
GetPeopleIDCode(ref number[0], ref length);
people.number = Encoding.GetEncoding("GB2312").GetString(number).Replace("\0", "").Trim();
byte[] nation = new byte[4];
length = 4;
GetPeopleNation(ref nation[0], ref length);
people.nation = Encoding.GetEncoding("GB2312").GetString(nation).Replace("\0", "").Trim();
byte[] validtermOfStart = new byte[30];
length = 16;
GetStartDate(ref validtermOfStart[0], ref length);
people.validtermOfStart = Encoding.GetEncoding("GB2312").GetString(validtermOfStart).Replace("\0", "").Trim();
byte[] birthday = new byte[30];
length = 16;
GetPeopleBirthday(ref birthday[0], ref length);
people.birthday = Encoding.GetEncoding("GB2312").GetString(birthday).Replace("\0", "").Trim();
byte[] address = new byte[70];
length = 70;
GetPeopleAddress(ref address[0], ref length);
people.address = Encoding.GetEncoding("GB2312").GetString(address).Replace("\0", "").Trim();
byte[] validtermOfEnd = new byte[30];
length = 16;
GetEndDate(ref validtermOfEnd[0], ref length);
people.validtermOfEnd = Encoding.GetEncoding("GB2312").GetString(validtermOfEnd).Replace("\0", "").Trim();
byte[] signdate = new byte[30];
length = 30;
GetDepartment(ref signdate[0], ref length);
people.signdate = Encoding.GetEncoding("GB2312").GetString(signdate).Replace("\0", "").Trim();
byte[] sex = new byte[30];
length = 3;
GetPeopleSex(ref sex[0], ref length);
people.sex = Encoding.GetEncoding("GB2312").GetString(sex).Replace("\0", "").Trim();
byte[] samid = new byte[32];
CVR_GetSAMID(ref samid[0]);
people.samid = Encoding.GetEncoding("GB2312").GetString(samid).Replace("\0", "").Trim();
byte[] ICFeatureData = new byte[1024];
GetFPDate(ref ICFeatureData[0], ref length);
people.listFeatureDataBean = new List<ICFeatureDataBean>();
ICFeatureDataBean f1 = new ICFeatureDataBean();
Array.Copy(ICFeatureData, 0, f1.buffer, 0, 512);
f1.fileHeadType = ICFeatureData[0];
f1.version = ICFeatureData[1];
f1.collectorCode = ICFeatureData[2];
f1.developerCode = ICFeatureData[3];
f1.registrationResultCode = (EnumRegistrationResult)ICFeatureData[4];
f1.fingerPositionCode = (EnumFingerPosition)ICFeatureData[5];
f1.quality = ICFeatureData[6];
people.listFeatureDataBean.Add(f1);
ICFeatureDataBean f2 = new ICFeatureDataBean();
Array.Copy(ICFeatureData, 512, f2.buffer, 0, 512);
f2.fileHeadType = ICFeatureData[512];
f2.version = ICFeatureData[513];
f2.developerCode = ICFeatureData[514];
f2.collectorCode = ICFeatureData[515];
f2.registrationResultCode = (EnumRegistrationResult)ICFeatureData[516];
f2.fingerPositionCode = (EnumFingerPosition)ICFeatureData[517];
f2.quality = ICFeatureData[518];
people.listFeatureDataBean.Add(f2);
FileStream file = new FileStream(System.Windows.Forms.Application.StartupPath + "\\zp.bmp", FileMode.Open);
Image img = Image.FromStream(file);
file.Close();
people.photo = img;
return people;
}
else
return null;
}
else
return null;
}
/// <summary>
/// 获取指纹
/// </summary>
/// <returns></returns>
public static byte[] HelperGetFPRawData()
{
System.IntPtr pRawData = Marshal.AllocHGlobal(92160);
byte[] RawData = new byte[92160];
int ret = LIVESCAN_GetFPRawData(0, pRawData);
if (ret == 1)
{
Marshal.Copy(pRawData, RawData, 0, 92160);
Marshal.FreeHGlobal(pRawData);
return RawData;
}
else
return null;
}
/// <summary>
/// 获取指纹特征
/// </summary>
/// <param name="cFingerCode"></param>
/// <param name="buffer"></param>
/// <returns></returns>
public static ICFeatureDataBean HelperGetFPFeatureExtract(EnumFingerPosition cFingerCode,byte[] buffer)
{
System.IntPtr pFingerImgBuf1 = Marshal.AllocHGlobal(buffer.Length);
Marshal.Copy(buffer, 0, pFingerImgBuf1, buffer.Length);
System.IntPtr pFingerFeatureBuf1 = Marshal.AllocHGlobal(512);
int ret = FP_FeatureExtract(0, (byte)cFingerCode, pFingerImgBuf1, pFingerFeatureBuf1);
if (ret == 1)
{
byte[] FeatureData = new byte[512];
Marshal.Copy(pFingerFeatureBuf1, FeatureData, 0, 512);
Marshal.FreeHGlobal(pFingerImgBuf1);
Marshal.FreeHGlobal(pFingerFeatureBuf1);
ICFeatureDataBean f1 = new ICFeatureDataBean();
f1.buffer = FeatureData;
f1.fileHeadType = f1.buffer[0];
f1.version = f1.buffer[1];
f1.collectorCode = f1.buffer[2];
f1.developerCode = f1.buffer[3];
f1.registrationResultCode = (EnumRegistrationResult)f1.buffer[4];
f1.fingerPositionCode = (EnumFingerPosition)f1.buffer[5];
f1.quality = f1.buffer[6];
return f1;
}
else
{
Marshal.FreeHGlobal(pFingerImgBuf1);
Marshal.FreeHGlobal(pFingerFeatureBuf1);
return null;
}
}
/// <summary>
/// 获取指纹图像
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public static Bitmap HelperGetFPBitmap(byte[] buffer)
{
Bitmap bm = new Bitmap(256, 360, PixelFormat.Format8bppIndexed);
Rectangle dimension = new Rectangle(0, 0, bm.Width, bm.Height);
BitmapData picData = bm.LockBits(dimension, ImageLockMode.ReadWrite, bm.PixelFormat);
IntPtr pixelStartAddress = picData.Scan0;
System.Runtime.InteropServices.Marshal.Copy(buffer, 0, pixelStartAddress, buffer.Length);
bm.UnlockBits(picData);
ColorPalette tempPalette;
using (Bitmap tempBmp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))
{
tempPalette = tempBmp.Palette;
}
for (int i = 0; i < 256; i++)
{
tempPalette.Entries[i] = Color.FromArgb(i, i, i);
}
bm.Palette = tempPalette;
return bm;
}
/// <summary>
/// 获取指纹质量
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public static int HelperGetFPQuality(byte[] buffer)
{
System.IntPtr pFingerImgBuf = Marshal.AllocHGlobal(92160);
Marshal.Copy(buffer, 0, pFingerImgBuf, buffer.Length);
int sb = 0;
int ret = FP_GetQualityScore(pFingerImgBuf, ref sb);
if (ret == 1)
return sb;
else
return 0;
}
/// <summary>
/// 指纹特征对比
/// </summary>
/// <param name="buffer1"></param>
/// <param name="buffer2"></param>
/// <returns></returns>
public static float HelperGetFeatureMatch(byte[] buffer1,byte[] buffer2)
{
System.IntPtr pFingerFeatureBuf1 = Marshal.AllocHGlobal(buffer1.Length);
Marshal.Copy(buffer1, 0, pFingerFeatureBuf1, buffer1.Length);
System.IntPtr pFingerFeatureBuf2 = Marshal.AllocHGlobal(buffer2.Length);
Marshal.Copy(buffer2, 0, pFingerFeatureBuf2, buffer2.Length);
float f = 0;
int ret = FP_FeatureMatch(pFingerFeatureBuf1, pFingerFeatureBuf2, ref f);
Marshal.FreeHGlobal(pFingerFeatureBuf1);
Marshal.FreeHGlobal(pFingerFeatureBuf2);
return f;
}
/// <summary>
/// 关闭
/// </summary>
public static void Close()
{
int ret = LIVESCAN_EndCapture(0);
ret = FP_End();
}
/// <summary>
/// 发出声音
/// </summary>
/// <param name="sendReport"></param>
public static void HelperSendReport(EnumSendReport sendReport)
{
CVR_SendReport((int)sendReport);
}
public static void HelperSendReport(EnumFingerPosition figerPostion)
{
switch (figerPostion)
{
case EnumFingerPosition.右手中指:
HelperSendReport(EnumSendReport.请采集右手中指指纹);
break;
case EnumFingerPosition.右手小指:
HelperSendReport(EnumSendReport.请采集右手小指指纹);
break;
case EnumFingerPosition.右手拇指:
HelperSendReport(EnumSendReport.请采集右手拇指指纹);
break;
case EnumFingerPosition.右手环指:
HelperSendReport(EnumSendReport.请采集右手无名指指纹);
break;
case EnumFingerPosition.右手食指:
HelperSendReport(EnumSendReport.请采集右手食指指纹);
break;
case EnumFingerPosition.左手中指:
HelperSendReport(EnumSendReport.请采集左手中指指纹);
break;
case EnumFingerPosition.左手小指:
HelperSendReport(EnumSendReport.请采集左手小指指纹);
break;
case EnumFingerPosition.左手拇指:
HelperSendReport(EnumSendReport.请采集左手拇指指纹);
break;
case EnumFingerPosition.左手环指:
HelperSendReport(EnumSendReport.请采集左手无名指指纹);
break;
case EnumFingerPosition.左手食指:
HelperSendReport(EnumSendReport.请采集左手食指指纹);
break;
}
}
#endregion
#region 附件
/* *
* B.4
* 错误代码 [-1,参数错误],[-2,内存分配失败,没有分配到足够的内存],[-3,功能未实现],[-4,设备不存在],[-5,设备未初始化],[-6,非法错误号],[-9,其他错误]
*
*
* */
#endregion
}
public class PeopleBean
{
/// <summary>
/// 姓名
/// </summary>
public string name { get; set; }
/// <summary>
/// 性别
/// </summary>
public string sex { get; set; }
/// <summary>
/// 民族
/// </summary>
public string nation { get; set; }
/// <summary>
/// 出生日期
/// </summary>
public string birthday { get; set; }
/// <summary>
/// 地址
/// </summary>
public string address { get; set; }
/// <summary>
/// 身份证号码
/// </summary>
public string number { get; set; }
/// <summary>
/// 签发机关
/// </summary>
public string signdate { get; set; }
/// <summary>
/// 起始日期
/// </summary>
public string validtermOfStart { get; set; }
/// <summary>
/// 截至日期
/// </summary>
public string validtermOfEnd { get; set; }
/// <summary>
/// 安全模块号
/// </summary>
public string samid { get; set;}
/// <summary>
/// 指纹
/// </summary>
public List<ICFeatureDataBean> listFeatureDataBean { get; set; }
/// <summary>
/// 照片
/// </summary>
public Image photo { get; set; }
}
/// <summary>
/// 指纹信息
/// </summary>
public class ICFeatureDataBean
{
/// <summary>
/// 文件头类型
/// </summary>
public int fileHeadType { get; set; }
/// <summary>
/// 指纹算法版本号
/// </summary>
public int version { get; set; }
/// <summary>
/// 指纹采集器代码
/// </summary>
public int collectorCode { get; set; }
/// <summary>
/// 指纹算法开发者代码
/// </summary>
public int developerCode { get; set; }
/// <summary>
/// 注册结果代码
/// 01H 表示“注册成功”,02H 表示“注册失败”,03H 表示“未注册”,09H 表示“未知”
/// </summary>
public EnumRegistrationResult registrationResultCode { get; set; }
/// <summary>
/// 指位代码
/// [0BH,右手拇指],[0CH,右手食指],[0DH,右手中指],[0EH,右手环指],[0FH,右手小指]
/// [10H,左手拇指],[11H,左手食指],[12H,左手中指],[13H,左手环指],[14H,左手小指]
/// [61H,右手不确定指位],[62H,左手不确定指位],[63H,其他不确定指位]
/// </summary>
public EnumFingerPosition fingerPositionCode { get; set; }
/// <summary>
/// 质量
/// 值01H表示最低质量,值64H表示最高质量,值00H表示“未知”
/// </summary>
public int quality { get; set; }
/// <summary>
/// 指纹数据
/// </summary>
public byte[] buffer = new byte[512];
}
/// <summary>
/// 注册结果
/// </summary>
public enum EnumRegistrationResult : int
{
注册成功=1,
注册失败=2,
未注册=3,
未知=9,
}
/// <summary>
/// 指位
/// </summary>
public enum EnumFingerPosition :int
{
右手拇指=11,
右手食指=12,
右手中指=13,
右手环指=14,
右手小指=15,
左手拇指=16,
左手食指=17,
左手中指=18,
左手环指=19,
左手小指=20,
右手不确定指位=97,
左手不确定指位=98,
其他不确定指位=99,
}
/// <summary>
/// 声音
/// </summary>
public enum EnumSendReport :int
{
请将您的身份证放在读卡区域内=1,
读卡成功=2,
读卡失败请重新放卡=3,
请采集右手拇指指纹=4,
请采集右手无名指指纹=5,
请采集右手中指指纹=6,
请采集右手食指指纹=7,
请采集右手小指指纹=8,
请采集左手拇指指纹=9,
请采集左手食指指纹=10,
请采集左手中指指纹=11,
请采集左手无名指指纹=12,
请采集左手小指指纹=13,
指纹采集成功=14,
指纹对比成功=15,
请面对摄像头=16,
照片采集成功=17,
}
}