S
starflying
Unregistered / Unconfirmed
GUEST, unregistred user!
const long IMAGEWIDTH =256;
const long IMAGEHEIGHT=256;
const long BioAPI_BIR_DATA_TYPE_RAW= 0x01; //原始图象数据
typedef struct DataTypeTAG
{
unsigned short nWidth; //指纹图象的宽度
unsigned short nHeight; //指纹图象的长度
unsigned short nDPI; //分辨率
unsigned short nVenID; //生产厂商ID
unsigned short nProductID; //产品ID
unsigned short nType; //数据类型
} DATATYPE, *PDATATYPE;
DATATYPE DataType;
DataType.nWidth = IMAGEWIDTH;
DataType.nHeight = IMAGEHEIGHT;
DataType.nDPI = 500;
DataType.nVenID = 0x1087; //ewaytek venid
DataType.nProductID = 0x0001; //productid
DataType.nType = BioAPI_BIR_DATA_TYPE_RAW; //原始图象
下面是一段将BMP文件转换成EWFingerprint2.dll中Process方法支持的数据类型的例子。
BOOL CBmpFile::Load( const char *pszUruFilename, VARIANT *vtGreyData)
{
//打开文件
CFile cf;
if (!cf.Open( pszUruFilename, CFile::modeRead ) )
{
return FALSE;
}
DWORD dwDibSize = cf.GetLength() - sizeof( BITMAPFILEHEADER );
//分配内存,将文件中的数据放入内存
unsigned char *pDib = (unsigned char *)malloc(cf.GetLength());
BITMAPFILEHEADER BFH;
try
{
if (cf.Read(&BFH, sizeof( BITMAPFILEHEADER )) != sizeof( BITMAPFILEHEADER ) || BFH.bfType != 'MB' || cf.Read(pDib, dwDibSize ) != dwDibSize ){
free(pDib);
cf.Close();
return FALSE;
}
}
catch( CFileException *e )
{
e->Delete();
cf.Close();
free(pDib);
return FALSE;
}
//BMP图象头
BITMAPINFOHEADER *pBIH = (BITMAPINFOHEADER *) pDib;
//BMP调色板
RGBQUAD *pPalette = (RGBQUAD *) &pDib[sizeof(BITMAPINFOHEADER)];
int nPaletteEntries = 1 << pBIH->biBitCount;
if (pBIH->biBitCount > 8 )
{
nPaletteEntries = 0;
}
else if (pBIH->biClrUsed != 0 )
{
nPaletteEntries = pBIH->biClrUsed;
}
//BMP图象数据
unsigned char * pDibBits = &pDib[sizeof(BITMAPINFOHEADER) + nPaletteEntries * sizeof(RGBQUAD)];
// 对于调色彩色图像,完成图像数据转换--索引调色->0~255灰级
// 不妨碍256灰级图像的解析
// 对于二值图像,需要注意没有调色板
//下面是将256彩色转换成256灰度的代码
if (pBIH->biBitCount != 1)
{
int i, j;
unsigned char *pImageData;
pImageData = pDibBits;
for (i=0; i<pBIH->biHeight; i++)
{
for(j=0; j<pBIH->biWidth; j++, pImageData++)
{
*pImageData = (pPalette[*pImageData].rgbRed * 299 +
pPalette[*pImageData].rgbGreen * 587 +
pPalette[*pImageData].rgbBlue * 114) / 1000;
}
}
}
DATATYPE DataType;
DataType.nWidth = pBIH->biWidth;
DataType.nHeight = pBIH->biHeight;
DataType.nDPI = pBIH->biXPelsPerMeter;
DataType.nVenID = 0x1087; //ewaytek venid
DataType.nProductID = 0x0001; //productid
DataType.nType = BioAPI_BIR_DATA_TYPE_RAW; //原始图象
//输出数据
SAFEARRAY* psa;
SAFEARRAYBOUND rgBound[1];
rgBound[0].lLbound = 0;
rgBound[0].cElements = dwDibSize - sizeof(BITMAPINFOHEADER) - nPaletteEntries * sizeof(RGBQUAD)
+ sizeof(DATATYPE);
psa = SafeArrayCreate(VT_UI1, 1, rgBound);
memcpy(psa->pvData, &DataType, sizeof(DATATYPE));
memcpy((unsigned char*)psa->pvData + sizeof(DATATYPE),
pDibBits,
dwDibSize - sizeof(BITMAPINFOHEADER) - nPaletteEntries * sizeof(RGBQUAD));
vtGreyData->vt = VT_ARRAY|VT_UI1;
vtGreyData->parray = psa;
free(pDib);
cf.Close();
return TRUE;
}
然后可以使用EWFingerprint2.dll中得到指纹特征值的方法,
上述Load( const char *pszUruFilename, VARIANT *vtGreyData)方法得到的数据可以作为第一个参数vtSource。
HRESULT Process([in] VARIANT vtSource, [out] VARIANT* vtDest,
[out, retval] long* lResult);
vtDest是返回的指纹特征值。
const long IMAGEHEIGHT=256;
const long BioAPI_BIR_DATA_TYPE_RAW= 0x01; //原始图象数据
typedef struct DataTypeTAG
{
unsigned short nWidth; //指纹图象的宽度
unsigned short nHeight; //指纹图象的长度
unsigned short nDPI; //分辨率
unsigned short nVenID; //生产厂商ID
unsigned short nProductID; //产品ID
unsigned short nType; //数据类型
} DATATYPE, *PDATATYPE;
DATATYPE DataType;
DataType.nWidth = IMAGEWIDTH;
DataType.nHeight = IMAGEHEIGHT;
DataType.nDPI = 500;
DataType.nVenID = 0x1087; //ewaytek venid
DataType.nProductID = 0x0001; //productid
DataType.nType = BioAPI_BIR_DATA_TYPE_RAW; //原始图象
下面是一段将BMP文件转换成EWFingerprint2.dll中Process方法支持的数据类型的例子。
BOOL CBmpFile::Load( const char *pszUruFilename, VARIANT *vtGreyData)
{
//打开文件
CFile cf;
if (!cf.Open( pszUruFilename, CFile::modeRead ) )
{
return FALSE;
}
DWORD dwDibSize = cf.GetLength() - sizeof( BITMAPFILEHEADER );
//分配内存,将文件中的数据放入内存
unsigned char *pDib = (unsigned char *)malloc(cf.GetLength());
BITMAPFILEHEADER BFH;
try
{
if (cf.Read(&BFH, sizeof( BITMAPFILEHEADER )) != sizeof( BITMAPFILEHEADER ) || BFH.bfType != 'MB' || cf.Read(pDib, dwDibSize ) != dwDibSize ){
free(pDib);
cf.Close();
return FALSE;
}
}
catch( CFileException *e )
{
e->Delete();
cf.Close();
free(pDib);
return FALSE;
}
//BMP图象头
BITMAPINFOHEADER *pBIH = (BITMAPINFOHEADER *) pDib;
//BMP调色板
RGBQUAD *pPalette = (RGBQUAD *) &pDib[sizeof(BITMAPINFOHEADER)];
int nPaletteEntries = 1 << pBIH->biBitCount;
if (pBIH->biBitCount > 8 )
{
nPaletteEntries = 0;
}
else if (pBIH->biClrUsed != 0 )
{
nPaletteEntries = pBIH->biClrUsed;
}
//BMP图象数据
unsigned char * pDibBits = &pDib[sizeof(BITMAPINFOHEADER) + nPaletteEntries * sizeof(RGBQUAD)];
// 对于调色彩色图像,完成图像数据转换--索引调色->0~255灰级
// 不妨碍256灰级图像的解析
// 对于二值图像,需要注意没有调色板
//下面是将256彩色转换成256灰度的代码
if (pBIH->biBitCount != 1)
{
int i, j;
unsigned char *pImageData;
pImageData = pDibBits;
for (i=0; i<pBIH->biHeight; i++)
{
for(j=0; j<pBIH->biWidth; j++, pImageData++)
{
*pImageData = (pPalette[*pImageData].rgbRed * 299 +
pPalette[*pImageData].rgbGreen * 587 +
pPalette[*pImageData].rgbBlue * 114) / 1000;
}
}
}
DATATYPE DataType;
DataType.nWidth = pBIH->biWidth;
DataType.nHeight = pBIH->biHeight;
DataType.nDPI = pBIH->biXPelsPerMeter;
DataType.nVenID = 0x1087; //ewaytek venid
DataType.nProductID = 0x0001; //productid
DataType.nType = BioAPI_BIR_DATA_TYPE_RAW; //原始图象
//输出数据
SAFEARRAY* psa;
SAFEARRAYBOUND rgBound[1];
rgBound[0].lLbound = 0;
rgBound[0].cElements = dwDibSize - sizeof(BITMAPINFOHEADER) - nPaletteEntries * sizeof(RGBQUAD)
+ sizeof(DATATYPE);
psa = SafeArrayCreate(VT_UI1, 1, rgBound);
memcpy(psa->pvData, &DataType, sizeof(DATATYPE));
memcpy((unsigned char*)psa->pvData + sizeof(DATATYPE),
pDibBits,
dwDibSize - sizeof(BITMAPINFOHEADER) - nPaletteEntries * sizeof(RGBQUAD));
vtGreyData->vt = VT_ARRAY|VT_UI1;
vtGreyData->parray = psa;
free(pDib);
cf.Close();
return TRUE;
}
然后可以使用EWFingerprint2.dll中得到指纹特征值的方法,
上述Load( const char *pszUruFilename, VARIANT *vtGreyData)方法得到的数据可以作为第一个参数vtSource。
HRESULT Process([in] VARIANT vtSource, [out] VARIANT* vtDest,
[out, retval] long* lResult);
vtDest是返回的指纹特征值。