# 华视读卡器照片BASE64功能集成说明 ## 📋 功能概述 已成功为华视读卡器添加身份证照片BASE64编码功能,使得读取身份证时能够同时获取照片的BASE64编码数据。 ## 🔧 技术实现 ### 1. 新增P/Invoke函数声明 在 `HuaShiIdCardBusiness.cs` 中添加了两个华视SDK函数: ```csharp [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()` 方法中新增以下字段: ```csharp // 照片信息(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数据包含以下新字段: ```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文件 - 确保 `Getbase64BMPData` 和 `Getbase64JpgData` 函数在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. **性能优化**:如果不需要照片,可以考虑添加参数控制是否获取照片数据