问题描述
我正在开发一项涉及保存指纹的功能,为此我使用了Digital Persona U 4500 reader.
下载并安装个人数字SDK,并构建Windows Form C#应用程序。
我添加了名称为DigitalPersona Fingerprint Enrollment Control
的控件,并实际上捕获了指纹
目标是能够可视化放置在阅读器中的足迹,以详细了解它的状况,为此,我添加了一个要在其中显示的图片框,并另外包括以下内容:
公共DPFP.Sample样本=新的DPFP.Sample(); //孟买的音乐
DPFP.Capture.SampleConversion Convertor = new DPFP.Capture.SampleConversion();
Bitmap bitmap = null;
Convertor.ConvertToPicture(sample,ref bitmap);
PicBoxHuella.Image = bitmap;
使用上一个操作,它应该在图片中显示样本,但事实并非如此。有效并确定样本为空。
我无法理解Null值,如果在放置足迹时我应该捕获该值,那么我会很感谢您对这个问题的指导。
解决方法
在 OnCaptured
事件中,您从 Fiv
en Data.Views
获取图像数据:
注意:pbFingerprint
是用于显示图像的 PictureBox。
private void enrollment_OnCaptured(EnrollmentControl enrollmentControl,CaptureResult captureResult,int fingerPosition)
{
if (captureResult.ResultCode == Constants.ResultCode.DP_SUCCESS)
{
if (captureResult.Data != null)
{
foreach (Fid.Fiv fiv in captureResult.Data.Views)
{
pbFingerprint.Image = CreateBitmap(fiv.RawImage,fiv.Width,fiv.Height);
}
}
}
}
/// <summary>
/// Create a bitmap from raw data in row/column format.
/// </summary>
/// <param name="bytes"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
private Bitmap CreateBitmap(byte[] bytes,int width,int height)
{
byte[] rgbBytes = new byte[bytes.Length * 3];
for (int i = 0; i <= bytes.Length - 1; i++)
{
rgbBytes[(i * 3)] = bytes[i];
rgbBytes[(i * 3) + 1] = bytes[i];
rgbBytes[(i * 3) + 2] = bytes[i];
}
Bitmap bmp = new Bitmap(width,height,PixelFormat.Format24bppRgb);
BitmapData data = bmp.LockBits(new Rectangle(0,bmp.Width,bmp.Height),ImageLockMode.WriteOnly,PixelFormat.Format24bppRgb);
for (int i = 0; i <= bmp.Height - 1; i++)
{
IntPtr p = new IntPtr(data.Scan0.ToInt64() + data.Stride * i);
System.Runtime.InteropServices.Marshal.Copy(rgbBytes,i * bmp.Width * 3,p,bmp.Width * 3);
}
bmp.UnlockBits(data);
return bmp;
}