读取二代身份证上面的相片,这个函数GetBmp(char * Wlt_File,int intf) 怎么用?

wsd_asp 2010-03-15 09:21:38
三、函数列表
GetBmp(char * Wlt_File,int intf) wlt文件解码成bmp文件;

四、函数说明
原 型:int GetBmp(char * Wlt_File,int intf);
说 明:本函数用于将wlt文件解码成bmp文件。
参 数:Wlt_File ----- wlt文件名
intf ----- 阅读设备通讯接口类型(1—RS-232C,2—USB)
返 回 值:生成*.bmp文件和以下返回信息
值 意义
1 相片解码解码正确
0 调用sdtapi.dll错误
-1 相片解码错误
-2 wlt文件后缀错误
-3 wlt文件打开错误
-4 wlt文件格式错误
-5 软件未授权
-6 设备连接错误

五、注意事项
1、 wlt文件的后缀要固定为”.wlt”,如:xp.wlt,相片解码成xp.bmp;
2、 本函数要与sdtapi.dll关联使用,并确认通讯端口处于关闭状态;


这是读取相片的文档,我现在把身份证上面的信息读取出来了 , 就是图片这里出了问题,图片是乱码,不知道GetBmp()第一个参数是什么值?

这是代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;


namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

[DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
static extern int SDT_StartFindIDCard(int iPort, byte[] pucManaInfo, int iIfOpen);

[DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
static extern int SDT_OpenPort(int iPort);

[DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
static extern int SDT_ClosePort(int iPort);

[DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
static extern int SDT_SelectIDCard(int iPort, byte[] pucManaMsg, int iIfOpen);

[DllImport("WltRS.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetBmp(string pucPHMsg, int intf);


[DllImport("sdtapi.dll", CallingConvention = CallingConvention.StdCall)]
static extern int SDT_ReadBaseMsg(int iPort, byte[] pucCHMsg, ref UInt32 puiCHMsgLen, byte[] pucPHMsg, ref UInt32 puiPHMsgLen, int iIfOpen);

private void button1_Click(object sender, EventArgs e)
{
byte[] CardPUCIIN = new byte[255];
byte[] pucManaMsg = new byte[255];
byte[] pucCHMsg = new byte[255];
byte[] pucPHMsg = new byte[3024];

UInt32 puiCHMsgLen = 0;
UInt32 puiPHMsgLen = 0;
int st = 0;

int iRet;
int iPort = 1001;
int iIfOpen = 0;
if (iIfOpen == 0)
{
iRet = SDT_OpenPort(iPort);
}
//读卡操作
st = SDT_StartFindIDCard(iPort, CardPUCIIN, iIfOpen);
if (st == 0x9f)//128
{
st = SDT_SelectIDCard(iPort, pucManaMsg, iIfOpen);
if (st != 0x90) return;//129
st = SDT_ReadBaseMsg(iPort, pucCHMsg, ref puiCHMsgLen, pucPHMsg, ref puiPHMsgLen, iIfOpen);
if (st != 0x90) return;
}
else
{
if (iIfOpen == 0)
{
//关闭
SDT_ClosePort(iPort);
return;
}
}
if (iIfOpen == 0)
{
//关闭
SDT_ClosePort(iPort);
}
就这个函数不知道怎么用
//int img = GetBmp(Application.StartupPath + @"\xp.wlt", 2);
//int img = GetBmp(pucPHMsg,2);



Card card = new Card(pucCHMsg,pucPHMsg);
//显示结果
this.txtname.Text = card.Name;
string nations = card.Nation;
if (nations == "01")
nations = "汉族";
else
nations = "其他民族";
this.txtnation.Text = nations;
string sexs = card.Sex;
if (sexs == "1")
sexs = "男";
else if (sexs == "2")
sexs = "女";
else
sexs = "其他";
this.txtsex.Text = sexs;
this.txtdate.Text = card.Date;
this.txtaddres.Text = card.Address;
this.txtcardId.Text = card.CardId;
this.txtorgan.Text = card.Organ;
this.txtbegin.Text = card.Begin + "-" + card.End;

}
}

class Card
{
#region 字段
//身份证号码
private string cardId;

public string CardId
{
get { return cardId; }
set { cardId = value; }
}

//姓名
private string name;

public string Name
{
get { return name; }
set { name = value; }
}

//性别
private string sex;

public string Sex
{
get { return sex; }
set { sex = value; }
}

//民族
private string nation;

public string Nation
{
get { return nation; }
set { nation = value; }
}

//出生日期
private string date;

public string Date
{
get { return date; }
set { date = value; }
}

//地址
private string address;

public string Address
{
get { return address; }
set { address = value; }
}

//发证机关
private string organ;

public string Organ
{
get { return organ; }
set { organ = value; }
}

//起始日期
private string begin;

public string Begin
{
get { return begin; }
set { begin = value; }
}

//截止日期
private string end;

public string End
{
get { return end; }
set { end = value; }
}

//图片
private Image picture;

public Image Picture
{
get { return picture; }
set { picture = value; }
}
#endregion

public Card(byte[] pucCHMsg, byte[] pucPHMsg)
{
这里返回所有的信息就相片是乱码,是一个正方形
string messge = System.Text.ASCIIEncoding.Unicode.GetString(pucCHMsg);
this.name = messge.Substring(0, 15);
messge = messge.Substring(15);

this.sex = messge.Substring(0, 1);
messge = messge.Substring(1);

this.nation = messge.Substring(0, 2);
messge = messge.Substring(2);

this.date = messge.Substring(0, 8);
messge = messge.Substring(8);

this.address = messge.Substring(0, 35);
messge = messge.Substring(35);

this.cardId = messge.Substring(0, 18);
messge = messge.Substring(18);

this.organ = messge.Substring(0, 15);
messge = messge.Substring(15);

this.begin = messge.Substring(0, 8);
messge = messge.Substring(8);

this.end = messge.Substring(0, 8);
messge = messge.Substring(8);
}
}
}

我该怎么得到这张相片
...全文
4278 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangminghuangqian 2012-07-19
  • 打赏
  • 举报
回复
QFile file("tmp.wlt");
if (!file.open(QIODevice::WriteOnly))
{
QMessageBox::warning(this,"错误","\n写相片文件失败\n");
return;
}
file.write(ID_Card_Reader.IDImage);
file.close();
int _error=GetBmp("tmp.wlt",2);
if(_error==1)
{
QPixmap pix;
pix.load("tmp.bmp");
pix.save("pho.jpg","jpg");
ui.labRYXX->setPixmap(pix);
}
else if(_error==0)
{
QMessageBox::warning(this,"错误","\n调用sdtapi.dll错误\n");
return;
}
else if(_error==-1)
{
QMessageBox::warning(this,"错误","\n相片解码错误\n");
return;
}
else if(_error==-2)
{
QMessageBox::warning(this,"错误","\nwlt文件后缀错误\n");
return;
}
else if(_error==-3)
{
QMessageBox::warning(this,"错误","\nwlt文件打开错误\n");
return;
}
else if(_error==-4)
{
QMessageBox::warning(this,"错误","\nwlt文件格式错误\n");
return;
}
else if(_error==-5)
{
QMessageBox::warning(this,"错误","\n软件未授权\n");
return;
}
else if(_error==-6)
{
QMessageBox::warning(this,"错误","\n设备连接错误\n");
return;
}
weiranlee 2011-11-05
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xiaozhulo 的回复:]

heheheeeeeee
[/Quote]
正解
tcs533 2010-10-18
  • 打赏
  • 举报
回复
把授权文件放到c盘根目录才能正常解码照片!!!
给分吧!!!
大地蚁人 2010-08-21
  • 打赏
  • 举报
回复
重复读取为什么会出现错误?尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
什么原因?
ainijing 2010-04-23
  • 打赏
  • 举报
回复
将图片专程byte数组 在复制到intptr中 然后传递进取
hangly 2010-04-23
  • 打赏
  • 举报
回复
读完身份证信息文件会保存到当前目录,用文件操作肯定能获取到得,这个测试成功过,图片都能保持到数据库中的
hangly 2010-04-23
  • 打赏
  • 举报
回复
读完身份证信息文件会保存到当前目录,用文件操作肯定能获取到得,这个测试成功过,图片都能保持到数据库中的
wsd_asp 2010-03-15
  • 打赏
  • 举报
回复
文档我也看了, 就是那个函数的参数不知道,也不知道怎么读到相片的图片
guyehanxinlei 2010-03-15
  • 打赏
  • 举报
回复
查看相关帮助文档,或是SDK中的Demo
wsd_asp 2010-03-15
  • 打赏
  • 举报
回复
进来请教高手,发帖都没高手回头,感到很失望啊...
  • 打赏
  • 举报
回复
没有做过,过来学习的....
wsd_asp 2010-03-15
  • 打赏
  • 举报
回复
int img = GetBmp(Application.StartupPath + @"\xp.wlt", 2);返回的是-3 wlt文件打开错误,为什么路径下也没找到该相片? 我现在想 相片是不是在这个"byte[] pucPHMsg = new byte[3024];" 里面, 但我又不知道怎么读取
xujiaoxiang 2010-03-15
  • 打赏
  • 举报
回复
-3 wlt文件打开错误

路径下有xp.wlt文件吗?

首先,将int img = GetBmp(Application.StartupPath + @"\xp.wlt", 2);
返回正确的值,然后再去研究怎么获取BMP图片。
wsd_asp 2010-03-15
  • 打赏
  • 举报
回复
请高手帮忙解决下
我也是第一做这功能, 其他信息都出来了,就相片这里卡住了
ztenv 2010-03-15
  • 打赏
  • 举报
回复
直接找他们要SDK吧;
studyuid 2010-03-15
  • 打赏
  • 举报
回复
太深奥了····学校学习·······
wsd_asp 2010-03-15
  • 打赏
  • 举报
回复
//int img = GetBmp(Application.StartupPath + @"\xp.wlt", 2);
这个返回是-3 wlt文件打开错误 路径下也没找到该相片
xujiaoxiang 2010-03-15
  • 打赏
  • 举报
回复
函数该怎么用?
//int img = GetBmp(Application.StartupPath + @"\xp.wlt", 2);
这样应该是正确的,你看返回值是否正确。
如果返回成功,去xp.wlt所在路径下看是否存在xp.bmp
xujiaoxiang 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wsd_asp 的回复:]
是不是在xp.wlt的路径下生成了xp.bmp??
xp.wlt是路径吗? 现在就是2个问题,一个是该怎么读到这个相片,二个就是这个函数该怎么用?
[/Quote]

是不是在xp.wlt所在路径下生成了xp.bmp??
wsd_asp 2010-03-15
  • 打赏
  • 举报
回复
是不是在xp.wlt的路径下生成了xp.bmp??
xp.wlt是路径吗? 现在就是2个问题,一个是该怎么读到这个相片,二个就是这个函数该怎么用?
加载更多回复(14)
内容概要:本文详细介绍了MySQL中InnoDB存储引擎的逻辑存储结构及其表分区技术。InnoDB的逻辑存储单元由高到低依次为表空间、段、区、页和行,其中表空间包括系统表空间、独立表空间、通用表空间、Undo表空间和临时表空间,每种表空间具有不同的用途和管理方式。文章进一步讲解了表分区的概念与类型,包括RANGE、LIST、HASH、KEY以及多字段COLUMNS分区,阐述了分区的优势如提升查询性能、便于数据维护、支持跨物理设备存储等,并列举了实际SQL操作示例,帮助理解分区表的创建、修改、删除及重组等操作。同时指出了分区的限制条件,如最大分区数量、主键约束要求等。; 适合人群:具备一定MySQL数据库基础,从事数据库开发、运维或架构设计的技术人员,尤其是工作中涉及大数据量表管理与性能优化的1-3年经验研发人员。; 使用场景及目标:①深入理解InnoDB存储机制,优化数据库物理结构设计;②掌握表分区技术,应用于海量数据存储与高效查询场景,如日志系统、订单系统的时间分区设计;③通过分区实现数据归档、快速删除历史数据、提升查询性能等运维目标; 阅读建议:学习时应结合MySQL实际环境动手实践文中提供的SQL命令,重点关注表空间管理和分区策略的选择,理解其对性能和维护的影响,并注意分区使用中的限制条件以避免设计失误。
内容概要:本文系统介绍了GitHub Copilot的实战使用技巧,涵盖其核心功能、提示工程、上下文管理、自定义配置及常见误区。文章强调Copilot不仅是代码补全工具,更是覆盖软件开发全生命周期的AI编程助手,重点讲解如何通过上下文工程、提示词结构化、斜杠命令与聊天参与者等方式提升代码生成质量,并结合实战案例展示在测试生成、代码重构、调试、文档编写等场景中的高效应用。同时指出Copilot的局限性,倡导“人为主导、AI辅助”的协作模式,强调代码审查与安全合规的重要性。; 适合人群:具备一定编程经验,希望提升开发效率的个人开发者、团队工程师及技术管理者,尤其是正在使用或计划引入AI编程工具的研发人员。; 使用场景及目标:①掌握Copilot在测试生成、代码解释、重构优化、调试排错等方面的高级用法;②学会构建高质量提示词与自定义指令,使AI输出更贴合项目规范;③规避常见使用陷阱,实现安全、可控、高效的AI辅助开发。; 阅读建议:此文档兼具理论指导与实操示范,建议结合实际开发环境边学边练,重点关注提示工程、上下文管理与自定义指令配置,持续迭代优化使用方式,并在团队中建立统一的AI编码规范与审查机制。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧