UNPKG

jz-h5-scancode

Version:

H5环境下的二维码扫描插件,提供与 uni.scanCode 完全兼容的 API 接口,支持摄像头实时扫码和图片扫码。v1.1.0优化性能,修复卡死问题

365 lines (275 loc) 9.07 kB
# jz-h5-scanCode ## 🔍 插件简介 jz-h5-scanCode 是一个专为 H5 环境设计的二维码扫描插件,提供与 `uni.scanCode` 完全兼容的 API 接口。插件采用模块化架构,支持多种识别引擎,提供微信风格的扫码界面。 ## ✨ 核心特性 ### 🎯 API 兼容性 -`uni.scanCode` API 完全兼容 - 支持相同的参数配置和回调函数 - 平台自动判断,H5 使用自定义实现,其他平台使用原生 API ### 📱 用户界面 - **微信风格设计**:仿微信扫码界面,用户体验一致 - **全屏沉浸式**:黑色背景,突出扫码区域 - **动态扫描线**:绿色扫描线上下移动,提供视觉反馈 - **自定义配置**:支持 8 种扫描框颜色选择 ### 🔧 技术架构 - **模块化设计**:核心功能分离,便于维护和扩展 - **多重识别引擎**:BarcodeDetector API + jsQR 库双重保障 - **智能降级**:摄像头不可用时自动切换到图片选择模式 - **图像预处理**:多种算法提高二维码识别成功率 ## 📦 安装使用 ### 1. uni-app 项目中使用 ```javascript // 导入插件 import jzH5ScanCode from '@/uni_modules/jz-h5-scanCode/js/index.js' // 基础扫码 jzH5ScanCode.scanCode({ success: (res) => { console.log('扫码成功:', res.result) }, fail: (res) => { console.log('扫码失败:', res.errMsg) } }) ``` ### 2. 普通 H5 项目中使用 ```javascript // ES6 模块导入 import jzH5ScanCode from './uni_modules/jz-h5-scanCode/js/index.js' // 或者直接引入 <script type="module"> import jzH5ScanCode from './uni_modules/jz-h5-scanCode/js/index.js' // 使用插件 </script> ``` ## 🔧 API 文档 ### scanCode(options) 主要扫码方法,与 uni.scanCode API 完全兼容。 #### 参数说明 | 参数名 | 类型 | 必填 | 默认值 | 说明 | |--------|------|------|--------|------| | success | Function | 否 | - | 扫码成功回调函数 | | fail | Function | 否 | - | 扫码失败回调函数 | | complete | Function | 否 | - | 扫码完成回调函数 | | scanType | Array | 否 | ['qrCode'] | 扫码类型,目前仅支持二维码 | | onlyFromCamera | Boolean | 否 | false | 是否仅允许从相机扫码 | | scanFrameColor | String | 否 | '#00ff00' | 扫描框颜色 | #### 回调参数 **success 回调参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | result | String | 扫码内容 | | scanType | String | 扫码类型 | | charSet | String | 字符集 | | imageChannel | String | 图像来源(camera/album) | | errMsg | String | 错误信息 | **fail 回调参数:** | 参数名 | 类型 | 说明 | |--------|------|------| | errMsg | String | 错误信息 | #### 使用示例 ```javascript // 基础扫码 jzH5ScanCode.scanCode({ success: (res) => { console.log('扫码结果:', res.result) console.log('扫码类型:', res.scanType) console.log('图像来源:', res.imageChannel) }, fail: (res) => { console.log('扫码失败:', res.errMsg) }, complete: () => { console.log('扫码完成') } }) // 高级配置 jzH5ScanCode.scanCode({ scanType: ['qrCode'], onlyFromCamera: true, scanFrameColor: '#007aff', success: (res) => { // 处理扫码结果 } }) ``` ### 静态方法 #### isCameraSupported() 检查设备是否支持摄像头。 ```javascript const supported = await jzH5ScanCode.isCameraSupported() console.log('摄像头支持:', supported) ``` #### isBarcodeDetectorSupported() 检查浏览器是否支持 BarcodeDetector API。 ```javascript const supported = jzH5ScanCode.isBarcodeDetectorSupported() console.log('BarcodeDetector 支持:', supported) ``` #### getSupportedFormats() 获取支持的条码格式。 ```javascript const formats = await jzH5ScanCode.getSupportedFormats() console.log('支持的格式:', formats) ``` #### getPluginInfo() 获取插件信息。 ```javascript const info = jzH5ScanCode.getPluginInfo() console.log('插件信息:', info) ``` ## 🎨 界面配置 ### 扫描框颜色 插件支持 8 种预设颜色: - `#00ff00` - 绿色(默认) - `#007aff` - 蓝色 - `#ff3b30` - 红色 - `#ff9500` - 橙色 - `#ffcc00` - 黄色 - `#34c759` - 青绿色 - `#af52de` - 紫色 - `#ffffff` - 白色 ```javascript jzH5ScanCode.scanCode({ scanFrameColor: '#007aff', // 蓝色扫描框 success: (res) => { // 处理结果 } }) ``` ## 🏗️ 技术架构 ### 核心模块 #### 1. index.js - 主入口 - API 兼容性处理 - 平台判断逻辑 - 事件管理和协调 #### 2. cameraScanner.js - 摄像头管理 - 摄像头权限申请 - 视频流获取和管理 - 图像数据提取 #### 3. qrCodeDecoder.js - 二维码解码 - BarcodeDetector API 集成 - jsQR 库集成 - 图像预处理算法 - 多重识别策略 #### 4. uiManager.js - 界面管理 - 微信风格 UI 创建 - 扫描动画效果 - 用户交互处理 - 响应式布局 #### 5. utils.js - 工具函数 - 调试日志管理 - 错误处理 - 通用工具方法 ### 识别流程 ```mermaid graph TD A[开始扫码] --> B{检查平台} B -->|H5| C[检查摄像头权限] B -->|其他平台| D[使用 uni.scanCode] C -->|有权限| E[创建扫码界面] C -->|无权限| F[降级到图片选择] E --> G[初始化解码器] F --> G G --> H[开始识别循环] H --> I{识别成功?} I -->|是| J[返回结果] I -->|否| H ``` ## 🔍 识别引擎 ### 1. BarcodeDetector API - **优先级**:最高 - **支持浏览器**:Chrome 83+, Edge 83+ - **特点**:原生实现,性能最佳 ### 2. jsQR 库 - **优先级**:备用 - **支持浏览器**:所有现代浏览器 - **特点**:纯 JavaScript 实现,兼容性好 ### 3. 图像预处理 - **灰度转换**:提高识别速度 - **对比度增强**:改善图像质量 - **二值化处理**:突出二维码特征 - **图像缩放**:适配不同尺寸 - **图像旋转**:处理倾斜的二维码 ## 📱 浏览器兼容性 | 功能 | Chrome | Firefox | Safari | Edge | 移动端 | |------|--------|---------|--------|------|--------| | 摄像头扫码 | ✅ 60+ | ✅ 55+ | ✅ 11+ | ✅ 79+ | ✅ | | 图片扫码 | ✅ | ✅ | ✅ | ✅ | ✅ | | BarcodeDetector | ✅ 83+ | ❌ | ❌ | ✅ 83+ | 部分 | | jsQR 识别 | ✅ | ✅ | ✅ | ✅ | ✅ | ## 🛠️ 开发指南 ### 本地开发 1. **环境要求** - 现代浏览器 - HTTPS 或 localhost 环境 - HTTP 服务器(不能直接打开 HTML 文件) 2. **调试模式** ```javascript // 开启调试日志 console.log('调试模式已开启') ``` 3. **常见问题** - **摄像头权限**:确保使用 HTTPS 或 localhost - **识别失败**:检查二维码清晰度和光线条件 - **界面异常**:检查 CSS 样式冲突 ### 自定义扩展 ```javascript // 扩展识别引擎 import { QRCodeDecoder } from './qrCodeDecoder.js' class CustomDecoder extends QRCodeDecoder { // 自定义识别逻辑 } // 扩展 UI 样式 import { UIManager } from './uiManager.js' class CustomUIManager extends UIManager { // 自定义界面 } ``` ## 📊 性能优化 ### 识别性能 - **多重引擎**:BarcodeDetector + jsQR 双重保障 - **图像预处理**:多种算法提高识别率 - **智能采样**:减少不必要的计算 ### 内存管理 - **及时清理**:自动释放摄像头资源 - **事件解绑**:防止内存泄漏 - **DOM 清理**:完全移除 UI 元素 ### 用户体验 - **快速响应**:扫码成功立即返回 - **流畅动画**:60fps 扫描线动画 - **错误提示**:友好的错误信息 ## 🔧 故障排除 ### 常见问题 1. **摄像头无法启动** - 检查是否使用 HTTPS 协议 - 确认浏览器摄像头权限 - 尝试刷新页面重新授权 2. **二维码识别失败** - 确保二维码清晰可见 - 调整光线条件 - 尝试不同角度和距离 3. **界面显示异常** - 检查 CSS 样式冲突 - 确认 z-index 设置 - 验证 DOM 结构完整性 ### 调试信息 ```javascript // 获取详细的调试信息 const info = jzH5ScanCode.getPluginInfo() console.log('插件版本:', info.version) console.log('浏览器支持:', info.cameraSupported) console.log('识别引擎:', info.barcodeDetectorSupported) ``` ## 📄 许可证 MIT License - 详见 [LICENSE](../../LICENSE) 文件 ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! ## 📞 支持 如有问题,请通过以下方式联系: - 提交 Issue - 邮箱:[your-email@example.com] - 文档:查看项目 README --- **版本**: 1.0.0 **更新时间**: 2024年 **作者**: JZ