华视读卡器照片BASE64功能集成说明.md 5.1 KB

华视读卡器照片BASE64功能集成说明

📋 功能概述

已成功为华视读卡器添加身份证照片BASE64编码功能,使得读取身份证时能够同时获取照片的BASE64编码数据。

🔧 技术实现

1. 新增P/Invoke函数声明

HuaShiIdCardBusiness.cs 中添加了两个华视SDK函数:

[DllImport("Termb.dll", CallingConvention = CallingConvention.StdCall)]
private extern static int Getbase64BMPData(byte[] pData, ref int pLen);

[DllImport("Termb.dll", CallingConvention = CallingConvention.StdCall)]
private extern static int Getbase64JpgData(byte[] pData, ref int pLen);

2. 新增核心方法

GetIdCardPhotoBase64() 主要方法

  • 优先尝试获取JPG格式的BASE64编码(文件更小,质量较好)
  • 如果JPG失败,尝试获取BMP格式的BASE64编码
  • 如果直接获取BASE64失败,使用备用方法获取二进制数据然后手动转换

GetPhotoBase64Fallback() 备用方法

  • 获取JPG或BMP二进制数据
  • 使用C# Convert.ToBase64String() 手动转换

3. 修改数据返回结构

GetIdCardInformation() 方法中新增以下字段:

// 照片信息(BASE64编码)
string photoBase64 = GetIdCardPhotoBase64();
info.Add("photoBase64", photoBase64);
info.Add("hasPhoto", !string.IsNullOrEmpty(photoBase64));

// 照片格式信息
if (!string.IsNullOrEmpty(photoBase64))
{
    // 根据BASE64前缀判断图片格式
    if (photoBase64.StartsWith("/9j/") || photoBase64.StartsWith("iVBORw0KGgo"))
        info.Add("photoFormat", "JPEG");
    else if (photoBase64.StartsWith("Qk") || photoBase64.StartsWith("BM"))
        info.Add("photoFormat", "BMP");
    else
        info.Add("photoFormat", "UNKNOWN");
    
    info.Add("photoSize", photoBase64.Length);
}

📊 返回数据结构

现在读取身份证时,返回的JSON数据包含以下新字段:

{
  "code": 200,
  "type": "huashi_idcard",
  "message": "华视读卡器读取身份证成功",
  "data": {
    "name": "张三",
    "sex": "男",
    "nation": "汉",
    "birthday": "19900101",
    "idCode": "123456789012345678",
    "address": "北京市朝阳区...",
    "department": "公安部",
    "startDate": "20200101",
    "endDate": "20300101",
    "sexCode": "1",
    "nationCode": "01",
    "certType": "I",
    "photoBase64": "/9j/4AAQSkZJRgABAQEAYABgAAD...",  // 新增
    "hasPhoto": true,                                   // 新增
    "photoFormat": "JPEG",                             // 新增
    "photoSize": 15420                                 // 新增
  },
  "device": "华视电子身份证读卡器"
}

🔍 字段说明

字段名 类型 说明
photoBase64 string 身份证照片的BASE64编码字符串
hasPhoto boolean 是否成功获取到照片数据
photoFormat string 照片格式(JPEG/BMP/UNKNOWN)
photoSize number BASE64编码字符串的长度

🛡️ 错误处理和容错机制

1. 多重获取策略

  • 优先使用华视SDK直接提供的BASE64函数
  • 备用方案:获取二进制数据后手动转换
  • 如果所有方法都失败,返回空字符串,不影响其他数据

2. 异常处理

  • 每个照片获取方法都有独立的try-catch
  • 照片获取失败不会影响身份证基本信息的读取
  • 详细的错误日志记录

3. 向后兼容

  • 所有现有功能保持不变
  • 新增字段只是额外信息,不影响现有业务逻辑

🧪 测试

测试页面

已创建 test_huashi_photo_base64.html 测试页面,包含:

  • 照片预览功能
  • BASE64数据展示
  • 照片下载功能
  • 完整的功能测试流程

测试步骤

  1. 启动ThCardReader服务
  2. 打开测试页面
  3. 初始化读卡器
  4. 读取身份证
  5. 查看照片BASE64数据和预览

⚠️ 注意事项

1. 依赖要求

  • 需要华视SDK的termb.dll文件
  • 确保 Getbase64BMPDataGetbase64JpgData 函数在DLL中可用

2. 性能考虑

  • BASE64编码的照片数据可能较大(15-40KB)
  • 建议在网络传输时考虑压缩或分段传输

3. 内存管理

  • 使用合适的缓冲区大小(38862*2字节)
  • 及时释放不用的byte数组

🔧 故障排除

如果photoBase64为空

  1. 检查华视SDK版本是否支持BASE64函数
  2. 确认身份证卡片状态良好
  3. 检查读卡器驱动程序

如果照片格式识别错误

  • BASE64前缀判断可能不准确
  • 可以通过 photoFormat 字段的值来调试

📝 更新日志

版本: 最新修改 日期: 2024年当前 修改内容:

  • ✅ 新增照片BASE64编码获取功能
  • ✅ 支持JPG和BMP两种格式
  • ✅ 增强错误处理和容错机制
  • ✅ 保持向后兼容性
  • ✅ 添加完整的测试页面

🎯 使用建议

  1. 生产环境:建议启用autoClose参数,避免设备被长期占用
  2. 开发调试:使用测试页面验证照片数据的正确性
  3. 错误处理:在业务代码中检查hasPhoto字段确认照片是否成功获取
  4. 性能优化:如果不需要照片,可以考虑添加参数控制是否获取照片数据