vfp读身份证阅读器,合成正反面照片问题?
已用论坛上的代码把身份证信息读出来了,只是不知道正反面合成照片怎么弄,望指教。这是厂家给的原型:
原 型4:int ReadBaseInfosPhoto( char * Name, char * Gender, char * Folk,char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd,char * directory)
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息以字符串格式输出。图象信息被解码后存为照片photo.bmp和photo.jpg,身份证正面反面合成图片card.jpg(在directory指定目录下)。
参 数:
Name [out] 字符型指针,指向姓名信息。需要在调用时分配内存,字节数不小31。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Folk [out] 字符型指针,指向民族信息。需要在调用时分配内存,字节数不小10。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小19。
Address [out] 字符型指针,指向地址信息。需要在调用时分配内存,字节数不小71。
Agency [out] 字符型指针,指向签证机关信息。需要在调用时分配内存,字节数不小31。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(NULL),表示照片存储在当前目录中,此时函数效果同ReadBaseInfos。
返 回 值:
值 意义
1 正确
0 错误
4 目录不存在
-4 缺少dewlt.dll、savephoto.dll等DLL
这是原码:
clear
DECLARE Integer SDT_OpenPort IN sdtapi.dll Integer iPort
DECLARE Integer SDT_ClosePort IN sdtapi.dll Integer iPort
DECLARE Integer SDT_StartFindIDCard IN sdtapi.dll Integer iPort, String @pucManaInfo, Integer iIfOpen
DECLARE Integer SDT_SelectIDCard IN sdtapi.dll Integer iPort, String @pucManaMsg, Integer iIfOpen
DECLARE Integer SDT_ReadBaseMsg IN sdtapi.dll Integer iPort, String @pucCHMsg, Integer @puiCHMsgLen, String @pucPHMsg, Integer @puiPHMsgLen, Integer iIfOpen
LOCAL iRet As Integer && 返回码
LOCAL iPort As Integer && 端口号
LOCAL iIfOpen As Integer && 是否需要打开端口
LOCAL pucManaInfo As String
LOCAL pucManaMsg As String
LOCAL pucCHMsg As String && 文字信息
LOCAL pucPHMsg As String && 照片信息
LOCAL pucFPMsg As String && 指纹信息
LOCAL uiCHMsgLen As Integer, uiPHMsgLen As Integer
iRet = 0
pucManaInfo = SPACE(4)
pucManaMsg = SPACE(8)
pucCHMsg = SPACE(512)
pucPHMsg = SPACE(1024)
pucFPMsg = SPACE(1024)
uiCHMsgLen = 0
uiPHMsgLen = 0
iPort = 1001 && 端口在系统设置下设置 1001为USB 设备
iIfOpen = 0
IF iIfOpen = 0
iRet = SDT_OpenPort(iPort)
IF iRet != 0x90
MESSAGEBOX("SDT_OpenPort 错误, 错误代码为 " + LTRIM(STR(iRet)), 16, '错误')
SDT_ClosePort(iPort)
RETURN
ENDIF
ENDIF
DO WHILE .T. && 找卡
iRet = SDT_StartFindIDCard(iPort, @pucManaInfo, iIfOpen)
IF iRet = 0x9f
iRet = SDT_SelectIDCard(iPort, @pucManaMsg, iIfOpen)
IF iRet == 0x90
EXIT
ENDIF
ENDIF
IF MESSAGEBOX("没有找到身份证,请放身份证?", 32 + 4, '询问') <> 6
EXIT
ENDIF
ENDDO
iRet = SDT_ReadBaseMsg(iPort, @pucCHMsg, @uiCHMsgLen, @pucPHMsg, @uiPHMsgLen, iIfOpen)
IF iRet != 0x90
MESSAGEBOX("SDT_ReadBaseMsg 错误, 错误代码为 " + LTRIM(STR(iRet)), 16, '错误')
IF iIfOpen = 0
SDT_ClosePort(iPort)
RETURN
ENDIF
ENDIF
tmp_read=STRCONV(left(pucCHMsg,uiCHMsgLen),6)
xm_read=ALLTRIM(LEFTC(tmp_read,15)) &&读出的字符串前15位是姓名
xbpd=SUBSTRC(tmp_read,16,1) &&读出的字符串前16位是性别,1代表男,2代表女
mzpd=SUBSTRC(tmp_read,17,2) &&读出的字符串前17-18位是民族,01是汉族
tmp_rq=SUBSTRC(tmp_read,19,8) &&读出的字符串前19-25位是出生日期
IF xbpd="1"
xb_read="男"
ELSE
xb_read="女"
ENDIF
***********
DO CASE
CASE mzpd="01"
mz_read="汉"
ENDCASE
csrq_read=LEFT(tmp_rq,4)+'.'+SUBSTR(tmp_rq,5,2)+'.'+SUBSTR(tmp_rq,7,2)
dz_read=SUBSTRC(tmp_read,27,35) &&地址的数据
sfzhm_read=SUBSTRC(tmp_read,62,18) &&身份证号码的数据
qfjg_read=ALLTRIM(SUBSTRC(tmp_read,80,15)) &&签发机关的数据
tmp_rqq=SUBSTRC(tmp_read,95,8) &&签发日期
tmp_rqz=SUBSTRC(tmp_read,103,8) &&有限期限
yxqq_read=LEFT(tmp_rqq,4)+'.'+SUBSTR(tmp_rqq,5,2)+'.'+SUBSTR(tmp_rqq,7,2)
yxqz_read=LEFT(tmp_rqz,4)+'.'+SUBSTR(tmp_rqz,5,2)+'.'+SUBSTR(tmp_rqz,7,2)
qtxx_read=RIGHTC(tmp_read,18) &&其他内容,暂时不知道是什么
*photo_tmp=SYS(5)+SYS(2003)+"\"+ALLTRIM(xm_read)+alltrim(sfzhm_read)+".bmp" &&这里是获得照片的程序
photo_tmp=SYS(5)+SYS(2003)+"\"+ALLTRIM(xm_read)+alltrim(sfzhm_read)+".wlt" &&这里是获得照片的程序
=STRTOFILE(LEFT(pucPHMsg,uiPHMsgLen),photo_tmp)
*kk=Strconv(LEFT(pucPHMsg,uiPHMsgLen),6)
*dd=Strconv(LEFT(pucPHMsg,uiPHMsgLen),5)
*STRTOFILE(dd,photo_tmp)
**************
IF iIfOpen = 0 &&关闭端口
SDT_ClosePort(iPort)
clear dlls
RETURN
ENDIF
clear dlls