id-scanner-lib 1.6.3 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/id-scanner-lib.esm.js +146 -49
- package/dist/id-scanner-lib.esm.js.map +1 -1
- package/dist/id-scanner-lib.js +146 -49
- package/dist/id-scanner-lib.js.map +1 -1
- package/package.json +1 -1
- package/src/core/config.ts +29 -11
- package/src/core/logger.ts +19 -2
- package/src/core/module-manager.ts +9 -0
- package/src/index.ts +1 -0
- package/src/modules/face/face-detector.ts +1 -0
- package/src/modules/face/index.ts +1 -0
- package/src/modules/face/liveness-detector.ts +1 -0
- package/src/modules/id-card/id-card-detector.ts +98 -35
- package/src/modules/id-card/index.ts +1 -0
- package/src/modules/qrcode/index.ts +1 -0
- package/src/utils/camera.ts +1 -0
- package/src/utils/resource-manager.ts +2 -2
- package/src/utils/worker.ts +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id-scanner-lib.esm.js","sources":["../src/core/config.ts","../src/core/logger.ts","../src/core/event-emitter.ts","../src/version.ts","../src/core/module-manager.ts","../src/core/base-module.ts","../src/core/result.ts","../src/modules/id-card/types.ts","../src/modules/id-card/id-card-detector.ts","../src/utils/image-processing.ts","../src/utils/performance.ts","../src/utils/worker.ts","../src/modules/id-card/ocr-worker.ts","../src/modules/id-card/ocr-processor.ts","../src/modules/id-card/anti-fake-detector.ts","../src/modules/id-card/index.ts","../src/modules/qrcode/types.ts","../src/modules/qrcode/qr-code-scanner.ts","../src/modules/qrcode/index.ts","../src/modules/face/index.ts","../src/core/loading-state.ts","../src/core/errors.ts","../src/index.ts"],"sourcesContent":["/**\n * @file 配置管理器\n * @description 提供全局配置管理功能\n * @module core/config\n */\n\n/**\n * 配置管理器\n * 负责存储和管理应用程序的配置\n */\nexport class ConfigManager {\n /** 单例实例 */\n private static instance: ConfigManager;\n \n /** 配置存储 */\n private config: Record<string, any> = {};\n \n /** 配置变更回调 */\n private changeCallbacks: Map<string, Array<(value: any, oldValue: any) => void>> = new Map();\n \n /**\n * 私有构造函数\n */\n private constructor() {\n // 设置默认配置\n this.config = {\n debug: false,\n logLevel: 'info',\n camera: {\n resolution: {\n width: 1280,\n height: 720\n },\n frameRate: 30,\n facingMode: 'environment'\n },\n performance: {\n useCache: true\n }\n };\n }\n \n /**\n * 获取单例实例\n */\n public static getInstance(): ConfigManager {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager();\n }\n return ConfigManager.instance;\n }\n \n /**\n * 获取配置值\n * @param key 配置键,支持点号分隔的路径\n * @param defaultValue 默认值\n */\n get<T = any>(key: string, defaultValue?: T): T {\n const value = this.getNestedValue(this.config, key);\n return (value !== undefined) ? value : (defaultValue as T);\n }\n \n /**\n * 设置配置值\n * @param key 配置键,支持点号分隔的路径\n * @param value 配置值\n */\n set<T = any>(key: string, value: T): void {\n const oldValue = this.get(key);\n \n // 如果值相同,不做任何事\n if (oldValue === value) {\n return;\n }\n \n this.setNestedValue(this.config, key, value);\n \n // 触发变更回调\n this.triggerChangeCallbacks(key, value, oldValue);\n }\n \n /**\n * 批量更新配置\n * @param config 配置对象\n */\n updateConfig(config: Record<string, any>): void {\n Object.entries(config).forEach(([key, value]) => {\n this.set(key, value);\n });\n }\n \n /**\n * 重置为默认配置\n */\n reset(): void {\n const oldConfig = { ...this.config };\n \n // 重新创建默认配置\n this.config = {\n debug: false,\n logLevel: 'info',\n camera: {\n resolution: {\n width: 1280,\n height: 720\n },\n frameRate: 30,\n facingMode: 'environment'\n },\n performance: {\n useCache: true\n }\n };\n \n // 触发所有回调\n Object.keys(oldConfig).forEach(key => {\n this.triggerChangeCallbacks(key, this.get(key), oldConfig[key]);\n });\n }\n \n /**\n * 注册配置变更回调\n * @param key 配置键\n * @param callback 回调函数\n */\n onConfigChange<T = any>(key: string, callback: (value: T, oldValue: T) => void): void {\n if (!this.changeCallbacks.has(key)) {\n this.changeCallbacks.set(key, []);\n }\n \n this.changeCallbacks.get(key)!.push(callback);\n }\n \n /**\n * 移除配置变更回调\n * @param key 配置键\n * @param callback 特定回调函数,如不提供则移除所有\n */\n offConfigChange<T = any>(key: string, callback?: (value: T, oldValue: T) => void): void {\n if (!this.changeCallbacks.has(key)) {\n return;\n }\n \n if (callback) {\n // 移除特定回调\n const callbacks = this.changeCallbacks.get(key)!;\n const index = callbacks.indexOf(callback as any);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n \n // 如果没有回调,删除键\n if (callbacks.length === 0) {\n this.changeCallbacks.delete(key);\n }\n } else {\n // 移除所有回调\n this.changeCallbacks.delete(key);\n }\n }\n \n /**\n * 获取嵌套值\n * @param obj 对象\n * @param path 路径\n */\n private getNestedValue(obj: Record<string, any>, path: string): any {\n // 处理根路径\n if (!path) {\n return obj;\n }\n \n // 处理嵌套路径\n const parts = path.split('.');\n let current = obj;\n \n for (const part of parts) {\n if (current === undefined || current === null) {\n return undefined;\n }\n \n current = current[part];\n }\n \n return current;\n }\n \n /**\n * 设置嵌套值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\n private setNestedValue(obj: Record<string, any>, path: string, value: any): void {\n // 处理根路径\n if (!path) {\n return;\n }\n \n // 处理嵌套路径\n const parts = path.split('.');\n let current = obj;\n \n // 遍历路径,直到倒数第二部分\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n \n // 如果不存在,创建新对象\n if (current[part] === undefined || current[part] === null || typeof current[part] !== 'object') {\n current[part] = {};\n }\n \n current = current[part];\n }\n \n // 设置最终值\n current[parts[parts.length - 1]] = value;\n }\n \n /**\n * 触发变更回调\n * @param key 配置键\n * @param value 新值\n * @param oldValue 旧值\n */\n private triggerChangeCallbacks(key: string, value: any, oldValue: any): void {\n // 触发特定键的回调\n if (this.changeCallbacks.has(key)) {\n const callbacks = this.changeCallbacks.get(key)!;\n callbacks.forEach(callback => {\n try {\n callback(value, oldValue);\n } catch (error) {\n console.error(`Error in config change callback for key ${key}:`, error);\n }\n });\n }\n \n // 触发父路径的回调\n const parts = key.split('.');\n while (parts.length > 1) {\n parts.pop();\n const parentKey = parts.join('.');\n \n if (this.changeCallbacks.has(parentKey)) {\n const parentValue = this.get(parentKey);\n this.changeCallbacks.get(parentKey)!.forEach(callback => {\n try {\n callback(parentValue, parentValue);\n } catch (error) {\n console.error(`Error in config change callback for parent key ${parentKey}:`, error);\n }\n });\n }\n }\n }\n\n /**\n * 检查模块是否启用\n * @param moduleName 模块名称\n */\n public isModuleEnabled(moduleName: string): boolean {\n const key = `modules.${moduleName}.enabled`;\n return this.get(key) ?? false;\n }\n}\n\n/**\n * 全局配置接口\n */\nexport interface GlobalConfig {\n /** 版本号 */\n version: string;\n /** 调试模式 */\n debug: boolean;\n /** 日志级别 */\n logLevel: string;\n /** 摄像头配置 */\n camera: {\n resolution: { width: number; height: number };\n frameRate: number;\n facingMode: string;\n };\n /** 性能配置 */\n performance: {\n useCache: boolean;\n };\n /** 模块配置 */\n modules: {\n face: { enabled: boolean };\n idcard: { enabled: boolean };\n qrcode: { enabled: boolean };\n };\n} \n\n/**\n * 模块配置接口\n * 定义所有模块共享的基础配置属性\n */\nexport interface ModuleConfig {\n /** 是否启用该模块 */\n enabled: boolean;\n /** 其他模块特定配置 */\n [key: string]: any;\n} ","/**\n * @file 日志系统\n * @description 提供统一的日志记录与管理功能\n * @module core/logger\n */\n\nimport { ConfigManager } from './config';\n\n/**\n * 日志级别枚举\n */\nexport enum LogLevel {\n DEBUG = 'debug',\n INFO = 'info',\n WARN = 'warn',\n ERROR = 'error'\n}\n\n/**\n * 日志条目接口\n */\nexport interface LogEntry {\n /** 日志级别 */\n level: LogLevel;\n /** 日志标签 */\n tag: string;\n /** 日志消息 */\n message: string;\n /** 时间戳 */\n timestamp: number;\n /** 额外数据 */\n data?: any;\n /** 错误 */\n error?: Error;\n}\n\n/**\n * 日志处理器接口\n */\nexport interface LogHandler {\n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void;\n}\n\n/**\n * 控制台日志处理器\n * 将日志输出到浏览器控制台\n */\nexport class ConsoleLogHandler implements LogHandler {\n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void {\n const timestamp = new Date(entry.timestamp).toISOString();\n const prefix = `[${timestamp}] [${entry.level.toUpperCase()}] [${entry.tag}]`;\n \n switch (entry.level) {\n case LogLevel.DEBUG:\n console.debug(prefix, entry.message, entry.error || '');\n break;\n case LogLevel.INFO:\n console.info(prefix, entry.message, entry.error || '');\n break;\n case LogLevel.WARN:\n console.warn(prefix, entry.message, entry.error || '');\n break;\n case LogLevel.ERROR:\n console.error(prefix, entry.message, entry.error || '');\n break;\n default:\n // 输出什么也不做\n }\n }\n}\n\n/**\n * 内存日志处理器\n * 将日志保存在内存中,用于后续分析或显示\n */\nexport class MemoryLogHandler implements LogHandler {\n /** 日志条目数组 */\n private entries: LogEntry[] = [];\n /** 最大日志条目数 */\n private maxEntries: number;\n \n /**\n * 构造函数\n * @param maxEntries 最大日志条目数,默认为1000\n */\n constructor(maxEntries: number = 1000) {\n this.maxEntries = maxEntries;\n }\n \n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void {\n this.entries.push(entry);\n \n // 如果超过最大条目数,移除最老的\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n \n /**\n * 获取所有日志条目\n */\n getEntries(): LogEntry[] {\n return [...this.entries];\n }\n \n /**\n * 根据级别过滤日志条目\n * @param level 日志级别\n */\n getEntriesByLevel(level: LogLevel): LogEntry[] {\n return this.entries.filter(entry => entry.level === level);\n }\n \n /**\n * 根据标签过滤日志条目\n * @param tag 日志标签\n */\n getEntriesByTag(tag: string): LogEntry[] {\n return this.entries.filter(entry => entry.tag === tag);\n }\n \n /**\n * 清空日志\n */\n clear(): void {\n this.entries = [];\n }\n}\n\n/**\n * 远程日志处理器\n * 将日志发送到远程服务器\n */\nexport class RemoteLogHandler implements LogHandler {\n /** 远程服务器URL */\n private endpoint: string;\n /** 批量发送的队列 */\n private queue: LogEntry[] = [];\n /** 最大队列长度 */\n private maxQueueSize: number;\n /** 发送间隔(毫秒) */\n private flushInterval: number;\n /** 定时发送的计时器ID */\n private timerId: number | null = null;\n \n /**\n * 构造函数\n * @param endpoint 远程服务器URL\n * @param maxQueueSize 最大队列长度,默认为100\n * @param flushInterval 发送间隔(毫秒),默认为5000\n */\n constructor(endpoint: string, maxQueueSize: number = 100, flushInterval: number = 5000) {\n this.endpoint = endpoint;\n this.maxQueueSize = maxQueueSize;\n this.flushInterval = flushInterval;\n \n // 设置定时发送\n this.startTimer();\n \n // 页面卸载前尝试发送剩余日志\n window.addEventListener('beforeunload', () => {\n this.flush();\n });\n }\n \n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void {\n // 只处理INFO以上级别的日志\n if (entry.level >= LogLevel.INFO) {\n this.queue.push(entry);\n \n // 如果队列满了,立即发送\n if (this.queue.length >= this.maxQueueSize) {\n this.flush();\n }\n }\n }\n \n /**\n * 发送队列中的日志\n */\n flush(): void {\n if (this.queue.length === 0) return;\n \n const entriesToSend = [...this.queue];\n this.queue = [];\n \n try {\n fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(entriesToSend),\n // 不等待响应,避免阻塞\n keepalive: true\n }).catch(err => {\n console.error('Failed to send logs to remote server:', err);\n // 失败时把日志放回队列,但防止无限增长\n if (this.queue.length < this.maxQueueSize) {\n this.queue = [...entriesToSend.slice(0, this.maxQueueSize - this.queue.length), ...this.queue];\n }\n });\n } catch (error) {\n console.error('Error sending logs:', error);\n }\n }\n \n /**\n * 开始定时发送\n */\n startTimer(): void {\n if (this.timerId !== null) return;\n \n this.timerId = window.setInterval(() => {\n this.flush();\n }, this.flushInterval);\n }\n \n /**\n * 停止定时发送\n */\n stopTimer(): void {\n if (this.timerId !== null) {\n window.clearInterval(this.timerId);\n this.timerId = null;\n }\n }\n}\n\n/**\n * 日志管理类\n * 中央日志管理器,提供统一的日志记录接口\n */\nexport class Logger {\n /** 单例实例 */\n private static instance: Logger;\n /** 配置管理器 */\n private config: ConfigManager;\n /** 日志处理器 */\n private handlers: LogHandler[] = [];\n /** 默认标签 */\n private defaultTag: string = 'IDScanner';\n /** 日志级别 */\n private logLevel: LogLevel = LogLevel.INFO;\n \n /**\n * 私有构造函数,防止直接实例化\n */\n private constructor() {\n this.config = ConfigManager.getInstance();\n \n // 默认添加控制台处理器\n this.addHandler(new ConsoleLogHandler());\n \n // 监听配置变化\n this.config.onConfigChange('logLevel', (level: LogLevel) => {\n this.debug('Logger', `Log level changed to ${level}`);\n });\n }\n \n /**\n * 获取单例实例\n */\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n \n /**\n * 添加日志处理器\n * @param handler 日志处理器\n */\n addHandler(handler: LogHandler): void {\n this.handlers.push(handler);\n }\n \n /**\n * 移除日志处理器\n * @param handler 要移除的处理器\n */\n removeHandler(handler: LogHandler): void {\n const index = this.handlers.indexOf(handler);\n if (index !== -1) {\n this.handlers.splice(index, 1);\n }\n }\n \n /**\n * 移除所有处理器\n */\n clearHandlers(): void {\n this.handlers = [];\n }\n \n /**\n * 设置默认标签\n * @param tag 默认标签\n */\n setDefaultTag(tag: string): void {\n this.defaultTag = tag;\n }\n \n /**\n * 记录调试级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n debug(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.DEBUG, tag, message, error);\n }\n \n /**\n * 记录信息级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n info(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.INFO, tag, message, error);\n }\n \n /**\n * 记录警告级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n warn(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.WARN, tag, message, error);\n }\n \n /**\n * 记录错误级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n error(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.ERROR, tag, message, error);\n }\n \n /**\n * 创建标记了特定标签的日志记录器\n * @param tag 标签\n */\n getTaggedLogger(tag: string): TaggedLogger {\n return new TaggedLogger(this, tag);\n }\n \n /**\n * 记录日志\n * @param level 日志级别\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n private log(level: LogLevel, tag: string, message: string, error?: Error): void {\n // 检查日志级别\n const levelValue = this.getLevelValue(level);\n const currentLevelValue = this.getLevelValue(this.logLevel);\n \n if (levelValue < currentLevelValue) {\n return;\n }\n \n // 创建日志条目\n const entry: LogEntry = {\n timestamp: Date.now(),\n level: level,\n tag: tag || this.defaultTag,\n message,\n error\n };\n \n // 分发到所有处理程序\n for (const handler of this.handlers) {\n try {\n handler.handle(entry);\n } catch (handlerError) {\n console.error(`[Logger] 处理程序错误:`, handlerError);\n }\n }\n \n // 如果没有处理程序,使用控制台\n if (this.handlers.length === 0) {\n this.consoleOutput(entry);\n }\n }\n\n /**\n * 控制台输出\n * @param entry 日志条目\n */\n private consoleOutput(entry: LogEntry): void {\n const timestamp = new Date(entry.timestamp).toISOString();\n const prefix = `[${timestamp}] [${entry.level.toUpperCase()}] [${entry.tag}]`;\n \n switch (entry.level) {\n case LogLevel.DEBUG:\n console.debug(`${prefix} ${entry.message}`, entry.error || '');\n break;\n case LogLevel.INFO:\n console.info(`${prefix} ${entry.message}`, entry.error || '');\n break;\n case LogLevel.WARN:\n console.warn(`${prefix} ${entry.message}`, entry.error || '');\n break;\n case LogLevel.ERROR:\n console.error(`${prefix} ${entry.message}`, entry.error || '');\n break;\n }\n }\n\n /**\n * 获取日志级别值\n * @param level 日志级别\n */\n private getLevelValue(level: LogLevel): number {\n switch (level) {\n case LogLevel.DEBUG:\n return 0;\n case LogLevel.INFO:\n return 1;\n case LogLevel.WARN:\n return 2;\n case LogLevel.ERROR:\n return 3;\n default:\n return 1; // 默认INFO级别\n }\n }\n\n /**\n * 设置日志级别\n * @param level 日志级别\n */\n public setLevel(level: LogLevel | string): void {\n if (typeof level === 'string') {\n switch (level) {\n case 'debug':\n this.logLevel = LogLevel.DEBUG;\n break;\n case 'info':\n this.logLevel = LogLevel.INFO;\n break;\n case 'warn':\n this.logLevel = LogLevel.WARN;\n break;\n case 'error':\n this.logLevel = LogLevel.ERROR;\n break;\n default:\n this.logLevel = LogLevel.INFO;\n }\n } else {\n this.logLevel = level;\n }\n \n this.debug('Logger', `日志级别已设置为 ${this.logLevel}`);\n }\n\n /**\n * 获取当前日志级别\n * @returns 当前日志级别\n */\n public getLevel(): LogLevel {\n return this.logLevel;\n }\n}\n\n/**\n * 带标签的日志记录器\n * 提供特定标签的简易日志接口\n */\nexport class TaggedLogger {\n /** 所属的主日志记录器 */\n private logger: Logger;\n /** 标签 */\n private tag: string;\n \n /**\n * 构造函数\n * @param logger 所属的主日志记录器\n * @param tag 标签\n */\n constructor(logger: Logger, tag: string) {\n this.logger = logger;\n this.tag = tag;\n }\n \n /**\n * 记录调试级别日志\n * @param message 消息\n * @param error 错误\n */\n debug(message: string, error?: Error): void {\n this.logger.debug(this.tag, message, error);\n }\n \n /**\n * 记录信息级别日志\n * @param message 消息\n * @param error 错误\n */\n info(message: string, error?: Error): void {\n this.logger.info(this.tag, message, error);\n }\n \n /**\n * 记录警告级别日志\n * @param message 消息\n * @param error 错误\n */\n warn(message: string, error?: Error): void {\n this.logger.warn(this.tag, message, error);\n }\n \n /**\n * 记录错误级别日志\n * @param message 消息\n * @param error 错误\n */\n error(message: string, error?: Error): void {\n this.logger.error(this.tag, message, error);\n }\n}\n\n/**\n * 日志级别枚举\n */\n","/**\n * @file 事件发射器\n * @description 提供基础的事件发射和订阅功能\n * @module core/event-emitter\n */\n\n/**\n * 事件处理器类型\n */\ntype EventHandler = (data?: any) => void;\n\n/**\n * 事件发射器基类\n * 提供基础的事件发射和订阅功能\n */\nexport class EventEmitter {\n /** 事件处理器映射 */\n private eventHandlers: Map<string, Set<EventHandler>> = new Map();\n \n /**\n * 订阅事件\n * @param eventName 事件名称\n * @param handler 事件处理器\n */\n on(eventName: string, handler: EventHandler): void {\n if (!this.eventHandlers.has(eventName)) {\n this.eventHandlers.set(eventName, new Set());\n }\n \n this.eventHandlers.get(eventName)!.add(handler);\n }\n \n /**\n * 取消订阅事件\n * @param eventName 事件名称\n * @param handler 事件处理器,如果不提供则移除该事件的所有处理器\n */\n off(eventName: string, handler?: EventHandler): void {\n if (!this.eventHandlers.has(eventName)) {\n return;\n }\n \n if (handler) {\n this.eventHandlers.get(eventName)!.delete(handler);\n \n // 如果没有处理器了,删除这个事件\n if (this.eventHandlers.get(eventName)!.size === 0) {\n this.eventHandlers.delete(eventName);\n }\n } else {\n // 移除该事件的所有处理器\n this.eventHandlers.delete(eventName);\n }\n }\n \n /**\n * 订阅事件,但只触发一次\n * @param eventName 事件名称\n * @param handler 事件处理器\n */\n once(eventName: string, handler: EventHandler): void {\n const onceHandler = (data?: any) => {\n handler(data);\n this.off(eventName, onceHandler);\n };\n \n this.on(eventName, onceHandler);\n }\n \n /**\n * 发射事件\n * @param eventName 事件名称\n * @param data 事件数据\n */\n emit(eventName: string, data?: any): void {\n if (!this.eventHandlers.has(eventName)) {\n return;\n }\n \n for (const handler of this.eventHandlers.get(eventName)!) {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in event handler for \"${eventName}\":`, error);\n }\n }\n }\n \n /**\n * 获取某个事件的处理器数量\n * @param eventName 事件名称\n */\n listenerCount(eventName: string): number {\n return this.eventHandlers.has(eventName) ? this.eventHandlers.get(eventName)!.size : 0;\n }\n \n /**\n * 移除所有事件处理器\n */\n removeAllListeners(): void {\n this.eventHandlers.clear();\n }\n \n /**\n * 获取所有事件名称\n */\n eventNames(): string[] {\n return Array.from(this.eventHandlers.keys());\n }\n} ","/**\n * @file 版本号文件\n * @description 定义库的版本号\n * @module Version\n */\n\n// 当前版本号\nexport const VERSION = '1.3.3';\n\n// 构建日期\nexport const BUILD_DATE = new Date().toISOString(); ","/**\n * @file 模块管理器\n * @description 统一管理库的各功能模块,提供模块的注册、初始化和卸载功能\n * @module core/module-manager\n */\n\nimport { Logger } from './logger';\nimport { EventEmitter } from './event-emitter';\nimport { VERSION } from '../version';\n\n/**\n * 模块接口\n * 所有功能模块必须实现此接口\n */\nexport interface Module {\n /** 模块名称 */\n name: string;\n \n /** 模块版本 */\n version: string;\n \n /** 模块是否已初始化 */\n isInitialized: boolean;\n \n /** 初始化模块 */\n initialize(): Promise<void>;\n \n /** 释放模块资源 */\n dispose(): Promise<void>;\n}\n\n/**\n * 模块配置接口\n */\nexport interface ModuleOptions {\n /** 是否启用该模块 */\n enabled?: boolean;\n \n /** 模块特定配置 */\n [key: string]: any;\n}\n\n/**\n * 模块管理器类\n * 负责管理所有功能模块的生命周期\n */\nexport class ModuleManager extends EventEmitter {\n private static instance: ModuleManager;\n private modules: Map<string, Module> = new Map();\n private logger: Logger;\n private initialized = false;\n \n /**\n * 获取模块管理器单例\n */\n public static getInstance(): ModuleManager {\n if (!ModuleManager.instance) {\n ModuleManager.instance = new ModuleManager();\n }\n return ModuleManager.instance;\n }\n \n /**\n * 私有构造函数,确保单例模式\n */\n private constructor() {\n super();\n this.logger = Logger.getInstance();\n this.logger.debug('ModuleManager', `初始化模块管理器 v${VERSION}`);\n }\n \n /**\n * 注册模块\n * @param module 要注册的模块\n * @returns 模块管理器实例,支持链式调用\n */\n public register(module: Module): ModuleManager {\n if (this.modules.has(module.name)) {\n this.logger.warn('ModuleManager', `模块 \"${module.name}\" 已经注册,将被覆盖`);\n }\n \n this.modules.set(module.name, module);\n this.logger.debug('ModuleManager', `注册模块: ${module.name} v${module.version}`);\n this.emit('module:registered', { name: module.name });\n \n return this;\n }\n \n /**\n * 获取模块\n * @param name 模块名称\n * @returns 模块实例\n */\n public getModule<T extends Module>(name: string): T | undefined {\n return this.modules.get(name) as T | undefined;\n }\n \n /**\n * 初始化所有注册的模块\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n \n this.logger.debug('ModuleManager', '开始初始化所有模块...');\n \n for (const [name, module] of this.modules.entries()) {\n try {\n this.logger.debug('ModuleManager', `初始化模块: ${name}`);\n await module.initialize();\n this.emit('module:initialized', { name });\n this.logger.debug('ModuleManager', `模块 ${name} 初始化完成`);\n } catch (error) {\n this.logger.error('ModuleManager', `模块 ${name} 初始化失败`, error instanceof Error ? error : undefined);\n this.emit('module:error', { name, error });\n throw new Error(`模块 ${name} 初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n this.initialized = true;\n this.logger.debug('ModuleManager', '所有模块初始化完成');\n this.emit('modules:initialized');\n }\n \n /**\n * 卸载所有模块并释放资源\n */\n public async dispose(): Promise<void> {\n this.logger.debug('ModuleManager', '开始释放所有模块资源...');\n \n for (const [name, module] of this.modules.entries()) {\n try {\n this.logger.debug('ModuleManager', `释放模块资源: ${name}`);\n await module.dispose();\n this.emit('module:disposed', { name });\n } catch (error) {\n this.logger.error('ModuleManager', `模块 ${name} 资源释放失败`, error instanceof Error ? error : undefined);\n this.emit('module:error', { name, error });\n }\n }\n \n this.modules.clear();\n this.initialized = false;\n this.logger.debug('ModuleManager', '所有模块资源已释放');\n this.emit('modules:disposed');\n }\n \n /**\n * 获取所有已注册的模块名称\n */\n public getRegisteredModules(): string[] {\n return Array.from(this.modules.keys());\n }\n \n /**\n * 检查模块是否已注册\n * @param name 模块名称\n */\n public hasModule(name: string): boolean {\n return this.modules.has(name);\n }\n} ","/**\n * @file 基础模块\n * @description 提供基础模块实现,作为所有功能模块的基类\n * @module core/base-module\n */\n\nimport { EventEmitter } from './event-emitter';\nimport { Logger } from './logger';\nimport { Module } from './module-manager';\nimport { VERSION } from '../version';\n\n/**\n * 基础模块类\n * 提供模块的基本功能和生命周期管理\n */\nexport abstract class BaseModule extends EventEmitter implements Module {\n /** 模块名称 */\n public abstract readonly name: string;\n \n /** 模块版本 */\n public readonly version: string = VERSION;\n \n /** 模块是否已初始化 */\n protected _isInitialized: boolean = false;\n \n /** 日志工具 */\n protected logger: Logger;\n \n /**\n * 构造函数\n */\n constructor() {\n super();\n this.logger = Logger.getInstance();\n }\n \n /**\n * 获取模块是否已初始化\n */\n public get isInitialized(): boolean {\n return this._isInitialized;\n }\n \n /**\n * 初始化模块\n * 子类必须实现此方法\n */\n public abstract initialize(): Promise<void>;\n \n /**\n * 释放模块资源\n * 子类可以覆盖此方法以添加额外的资源释放逻辑\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放模块资源');\n \n // 重置初始化状态\n this._isInitialized = false;\n \n // 删除所有事件监听器\n this.removeAllListeners();\n \n this.logger.debug(this.name, '模块资源已释放');\n }\n \n /**\n * 检查模块是否已初始化,如果未初始化则抛出错误\n */\n protected ensureInitialized(): void {\n if (!this._isInitialized) {\n throw new Error(`模块 ${this.name} 尚未初始化`);\n }\n }\n} ","/**\n * @file 结果包装类\n * @description 提供统一的操作结果封装\n * @module core/result\n */\n\n/**\n * 结果类型\n * 用于封装操作的成功或失败结果\n */\nexport class Result<T = any> {\n /** 结果数据 */\n private _data?: T;\n /** 错误对象 */\n private _error?: Error;\n /** 是否成功 */\n private _success: boolean;\n /** 额外元数据 */\n private _meta?: Record<string, any>;\n \n /**\n * 构造函数\n * @param success 是否成功\n * @param data 结果数据\n * @param error 错误对象\n * @param meta 元数据\n */\n constructor(\n success: boolean,\n data?: T,\n error?: Error,\n meta?: Record<string, any>\n ) {\n this._success = success;\n this._data = data;\n this._error = error;\n this._meta = meta;\n }\n \n /**\n * 创建成功结果\n * @param data 结果数据\n * @param meta 元数据\n */\n static success<T>(data?: T, meta?: Record<string, any>): Result<T> {\n return new Result<T>(true, data, undefined, meta);\n }\n \n /**\n * 创建失败结果\n * @param error 错误对象\n * @param meta 元数据\n */\n static failure<T>(error: Error, meta?: Record<string, any>): Result<T> {\n return new Result<T>(false, undefined, error, meta);\n }\n \n /**\n * 检查结果是否成功\n */\n isSuccess(): boolean {\n return this._success;\n }\n \n /**\n * 检查结果是否失败\n */\n isFailure(): boolean {\n return !this._success;\n }\n \n /**\n * 获取结果数据\n */\n get data(): T | undefined {\n return this._data;\n }\n \n /**\n * 获取错误对象\n */\n get error(): Error | undefined {\n return this._error;\n }\n \n /**\n * 获取元数据\n */\n get meta(): Record<string, any> | undefined {\n return this._meta;\n }\n \n /**\n * 映射结果(如果成功)\n * @param fn 映射函数\n */\n map<U>(fn: (data: T) => U): Result<U> {\n if (this.isSuccess() && this._data !== undefined) {\n try {\n const newData = fn(this._data);\n return Result.success<U>(newData, this._meta);\n } catch (error) {\n return Result.failure<U>(error instanceof Error ? error : new Error(String(error)), this._meta);\n }\n }\n \n return Result.failure<U>(this._error!, this._meta);\n }\n \n /**\n * 如果成功,则执行函数\n * @param fn 要执行的函数\n */\n onSuccess(fn: (data?: T) => void): Result<T> {\n if (this.isSuccess()) {\n try {\n fn(this._data);\n } catch (error) {\n console.error('Error in onSuccess handler:', error);\n }\n }\n return this;\n }\n \n /**\n * 如果失败,则执行函数\n * @param fn 要执行的函数\n */\n onFailure(fn: (error: Error) => void): Result<T> {\n if (this.isFailure() && this._error) {\n try {\n fn(this._error);\n } catch (error) {\n console.error('Error in onFailure handler:', error);\n }\n }\n return this;\n }\n \n /**\n * 无论成功失败,都执行函数\n * @param fn 要执行的函数\n */\n onFinally(fn: () => void): Result<T> {\n try {\n fn();\n } catch (error) {\n console.error('Error in onFinally handler:', error);\n }\n return this;\n }\n \n /**\n * 转换为字符串\n */\n toString(): string {\n if (this.isSuccess()) {\n return `Success: ${JSON.stringify(this._data)}`;\n } else {\n return `Failure: ${this._error?.message || 'Unknown error'}`;\n }\n }\n} ","/**\n * @file 身份证模块类型定义\n * @description 身份证模块相关的类型和接口定义\n * @module modules/id-card/types\n */\n\n/**\n * 身份证类型枚举\n */\nexport enum IDCardType {\n /** 第二代居民身份证正面 */\n FRONT = 'front',\n /** 第二代居民身份证背面 */\n BACK = 'back',\n /** 第一代居民身份证 */\n FIRST_GENERATION = 'first_generation',\n /** 临时身份证 */\n TEMPORARY = 'temporary',\n /** 外国人永久居留证 */\n FOREIGN_PERMANENT = 'foreign_permanent',\n /** 港澳台居民居住证 */\n HMT_RESIDENT = 'hmt_resident',\n /** 未知类型 */\n UNKNOWN = 'unknown'\n}\n\n/**\n * 证件边缘信息\n */\nexport interface IDCardEdge {\n /** 左上角坐标 */\n topLeft: { x: number; y: number };\n /** 右上角坐标 */\n topRight: { x: number; y: number };\n /** 右下角坐标 */\n bottomRight: { x: number; y: number };\n /** 左下角坐标 */\n bottomLeft: { x: number; y: number };\n}\n\n/**\n * 身份证信息\n */\nexport interface IDCardInfo {\n nationality?: string;\n issuingAuthority?: string;\n validPeriod?: string;\n /** 身份证类型 */\n type?: IDCardType;\n /** 身份证边缘信息 */\n edge?: IDCardEdge;\n /** 姓名 */\n name?: string;\n /** 性别 */\n gender?: string;\n /** 民族 */\n ethnicity?: string;\n /** 出生日期,格式: YYYY-MM-DD */\n birthDate?: string;\n /** 地址 */\n address?: string;\n /** 身份证号码 */\n idNumber?: string;\n /** 签发机关 */\n issueAuthority?: string;\n /** 有效期起始日期,格式: YYYY-MM-DD */\n validFrom?: string;\n /** 有效期截止日期,格式: YYYY-MM-DD */\n validTo?: string;\n /** 相片区域坐标 */\n photoRegion?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n /** 原始身份证图像 */\n image?: ImageData;\n /** 置信度 */\n confidence?: number;\n /** 防伪检测结果 */\n antiFake?: {\n /** 是否通过防伪检测 */\n passed: boolean;\n /** 防伪检测分数 */\n score: number;\n /** 防伪特征检测结果 */\n features?: {\n /** 荧光油墨 */\n fluorescent?: boolean;\n /** 微缩文字 */\n microtext?: boolean;\n /** 光变图案 */\n opticalVariable?: boolean;\n /** 纹理 */\n texture?: boolean;\n /** 暗记 */\n watermark?: boolean;\n };\n };\n}\n\n/**\n * 身份证模块配置选项\n */\nexport interface IDCardModuleOptions {\n /** 是否启用模块 */\n enabled?: boolean;\n \n /** 检测器配置 */\n detector?: {\n /** 最小置信度 */\n minConfidence?: number;\n /** 是否启用OCR识别 */\n enableOCR?: boolean;\n /** 是否启用防伪检测 */\n enableAntiFake?: boolean;\n };\n \n /** OCR处理器配置 */\n ocr?: {\n /** 是否使用Web Worker处理OCR */\n useWorker?: boolean;\n /** 最大图像尺寸 */\n maxImageDimension?: number;\n /** 亮度调整 */\n brightness?: number;\n /** 对比度调整 */\n contrast?: number;\n };\n \n /** 防伪检测配置 */\n antiFake?: {\n /** 防伪检测灵敏度 */\n sensitivity?: number;\n /** 最小置信度 */\n minConfidence?: number;\n };\n}\n\n/**\n * 身份证验证结果\n */\nexport interface IDCardVerificationResult {\n /** 是否验证通过 */\n isValid: boolean;\n /** 验证分数 */\n score: number;\n /** 失败原因 */\n failureReason?: string;\n /** 验证详情 */\n details?: {\n /** 身份证号码是否有效 */\n idNumberValid?: boolean;\n /** 签发日期是否有效 */\n issueDateValid?: boolean;\n /** 有效期是否过期 */\n isExpired?: boolean;\n /** 防伪检测是否通过 */\n antiFakePassed?: boolean;\n };\n}\n\n/**\n * 图像处理配置选项\n */\nexport interface ImageProcessOptions {\n /** 是否进行预处理 */\n preprocess?: boolean;\n /** 是否校正图像 */\n correctPerspective?: boolean;\n /** 是否增强图像 */\n enhance?: boolean;\n /** 是否去噪 */\n denoise?: boolean;\n /** 是否二值化 */\n binarize?: boolean;\n} ","/**\n * @file 身份证检测器\n * @description 提供身份证检测和解析功能\n * @module modules/id-card/id-card-detector\n */\n\nimport { EventEmitter } from '../../core/event-emitter';\nimport { Logger } from '../../core/logger';\nimport { Result } from '../../core/result';\nimport { IDCardType, IDCardEdge, IDCardInfo } from './types';\n\n/**\n * 身份证检测器配置选项\n */\nexport interface IDCardDetectorOptions {\n /** 是否启用 */\n enabled?: boolean;\n /** 最小置信度 */\n minConfidence?: number;\n /** 是否检测身份证类型 */\n detectType?: boolean;\n /** 是否检测边缘 */\n detectEdge?: boolean;\n /** 是否启用边缘检测(用于更精确的边缘检测) */\n enableEdgeDetection?: boolean;\n /** 是否启用OCR识别 */\n enableOCR?: boolean;\n /** 是否裁剪并校正图像 */\n cropAndAlign?: boolean;\n /** 是否启用防伪检测 */\n enableAntiFake?: boolean;\n /** 是否返回原始图像 */\n returnImage?: boolean;\n /** 模型路径 */\n modelPath?: string;\n}\n\n/**\n * 图像处理配置选项\n */\nexport interface ImageProcessOptions {\n /** 是否进行预处理 */\n preprocess?: boolean;\n /** 是否校正图像 */\n correctPerspective?: boolean;\n /** 是否增强图像 */\n enhance?: boolean;\n /** 是否去噪 */\n denoise?: boolean;\n /** 是否二值化 */\n binarize?: boolean;\n}\n\n/**\n * 身份证检测器类\n */\nexport class IDCardDetector extends EventEmitter {\n private options: IDCardDetectorOptions;\n private logger: Logger;\n private initialized: boolean = false;\n private models: {\n detection?: any;\n ocr?: any;\n antiFake?: any;\n } = {};\n\n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(options: IDCardDetectorOptions = {}) {\n super();\n this.options = {\n enabled: true,\n minConfidence: 0.7,\n detectType: true,\n detectEdge: true,\n enableEdgeDetection: false,\n enableOCR: true,\n cropAndAlign: true,\n enableAntiFake: false,\n returnImage: false,\n modelPath: '/models/id-card',\n ...options\n };\n this.logger = Logger.getInstance();\n }\n\n /**\n * 初始化检测器\n */\n public async initialize(): Promise<void> {\n if (this.initialized || !this.options.enabled) {\n return;\n }\n\n this.logger.debug('IDCardDetector', '初始化身份证检测器');\n \n try {\n // 加载检测模型\n await this.loadDetectionModel();\n \n // 如果启用OCR,加载OCR模型\n if (this.options.enableOCR) {\n await this.loadOCRModel();\n }\n \n // 如果启用防伪检测,加载防伪模型\n if (this.options.enableAntiFake) {\n await this.loadAntiFakeModel();\n }\n \n this.initialized = true;\n this.emit('detector:initialized', {});\n this.logger.debug('IDCardDetector', '身份证检测器初始化完成');\n } catch (error) {\n this.logger.error('IDCardDetector', '身份证检测器初始化失败', error as Error);\n throw error;\n }\n }\n\n /**\n * 加载检测模型\n * @private\n */\n private async loadDetectionModel(): Promise<void> {\n // 实际项目中,这里应该加载检测模型\n this.logger.debug('IDCardDetector', '加载身份证检测模型');\n \n // 模拟加载模型的延迟\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 设置模型\n this.models.detection = {\n loaded: true,\n name: 'id-card-detection'\n };\n }\n\n /**\n * 加载OCR模型\n * @private\n */\n private async loadOCRModel(): Promise<void> {\n // 实际项目中,这里应该加载OCR模型\n this.logger.debug('IDCardDetector', '加载身份证OCR模型');\n \n // 模拟加载模型的延迟\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 设置模型\n this.models.ocr = {\n loaded: true,\n name: 'id-card-ocr'\n };\n }\n\n /**\n * 加载防伪模型\n * @private\n */\n private async loadAntiFakeModel(): Promise<void> {\n // 实际项目中,这里应该加载防伪模型\n this.logger.debug('IDCardDetector', '加载身份证防伪模型');\n \n // 模拟加载模型的延迟\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 设置模型\n this.models.antiFake = {\n loaded: true,\n name: 'id-card-anti-fake'\n };\n }\n\n /**\n * 处理图像\n * @param image 图像源(可以是ImageData、HTMLImageElement、HTMLCanvasElement等)\n * @param processOptions 图像处理选项\n * @returns 处理结果\n */\n public async processImage(\n image: ImageData | HTMLImageElement | HTMLCanvasElement,\n processOptions: ImageProcessOptions = {}\n ): Promise<Result<IDCardInfo>> {\n if (!this.initialized) {\n return Result.failure(new Error('身份证检测器未初始化'));\n }\n\n try {\n this.logger.debug('IDCardDetector', '开始处理图像');\n \n // 预处理图像\n const processedImage = await this.preprocessImage(image, processOptions);\n \n // 检测身份证\n const detectionResult = await this.detectIDCard(processedImage);\n \n if (!detectionResult || detectionResult.confidence < (this.options.minConfidence || 0.7)) {\n return Result.failure(new Error('未检测到身份证或置信度过低'));\n }\n \n let idCardInfo: IDCardInfo = {\n type: detectionResult.type,\n edge: detectionResult.edge,\n confidence: detectionResult.confidence\n };\n \n // 如果启用OCR识别,提取文字信息\n if (this.options.enableOCR && this.models.ocr) {\n // 裁剪并校正图像\n const alignedImage = this.options.cropAndAlign ? \n await this.cropAndAlign(processedImage, detectionResult.edge) : \n processedImage;\n \n // 识别文字\n const ocrResult = await this.recognizeText(alignedImage, detectionResult.type);\n \n // 合并结果\n idCardInfo = {\n ...idCardInfo,\n ...ocrResult\n };\n }\n \n // 如果启用防伪检测,进行防伪检测\n if (this.options.enableAntiFake && this.models.antiFake) {\n const antiFakeResult = await this.detectAntiFake(processedImage, detectionResult);\n idCardInfo.antiFake = antiFakeResult;\n }\n \n // 如果需要返回原始图像\n if (this.options.returnImage) {\n // 根据图像类型获取ImageData\n if (image instanceof ImageData) {\n idCardInfo.image = image;\n } else if (image instanceof HTMLCanvasElement) {\n const context = image.getContext('2d');\n if (context) {\n idCardInfo.image = context.getImageData(0, 0, image.width, image.height);\n }\n } else if (image instanceof HTMLImageElement && image.complete) {\n const canvas = document.createElement('canvas');\n canvas.width = image.naturalWidth;\n canvas.height = image.naturalHeight;\n const context = canvas.getContext('2d');\n if (context) {\n context.drawImage(image, 0, 0);\n idCardInfo.image = context.getImageData(0, 0, canvas.width, canvas.height);\n }\n }\n }\n \n this.logger.debug('IDCardDetector', '图像处理完成');\n this.emit('detector:result', { result: idCardInfo });\n \n return Result.success(idCardInfo);\n } catch (error) {\n this.logger.error('IDCardDetector', '图像处理失败', error as Error);\n return Result.failure(error as Error);\n }\n }\n\n /**\n * 预处理图像\n * @param image 图像源\n * @param options 处理选项\n * @returns 处理后的图像\n * @private\n */\n private async preprocessImage(\n image: ImageData | HTMLImageElement | HTMLCanvasElement,\n options: ImageProcessOptions\n ): Promise<ImageData> {\n // 实际项目中,这里应该对图像进行预处理\n this.logger.debug('IDCardDetector', '预处理图像');\n \n // 创建ImageData对象\n let imageData: ImageData;\n \n if (image instanceof ImageData) {\n imageData = image;\n } else {\n const canvas = document.createElement('canvas');\n const width = image instanceof HTMLImageElement ? image.naturalWidth : image.width;\n const height = image instanceof HTMLImageElement ? image.naturalHeight : image.height;\n \n canvas.width = width;\n canvas.height = height;\n \n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('无法获取Canvas上下文');\n }\n \n if (image instanceof HTMLImageElement) {\n context.drawImage(image, 0, 0);\n } else {\n context.drawImage(image, 0, 0);\n }\n \n imageData = context.getImageData(0, 0, width, height);\n }\n \n // 应用图像处理选项\n // 实际项目中,这里应该根据options进行相应的图像处理\n \n return imageData;\n }\n\n /**\n * 检测身份证\n * @param image 图像数据\n * @returns 检测结果\n * @private\n */\n private async detectIDCard(image: ImageData): Promise<{\n type: IDCardType;\n edge: IDCardEdge;\n confidence: number;\n } | null> {\n // 实际项目中,这里应该调用模型进行身份证检测\n this.logger.debug('IDCardDetector', '检测身份证');\n \n // 模拟检测结果\n // 在实际应用中,这里应该使用机器学习模型进行推理\n return {\n type: IDCardType.FRONT,\n edge: {\n topLeft: { x: 10, y: 10 },\n topRight: { x: image.width - 10, y: 10 },\n bottomRight: { x: image.width - 10, y: image.height - 10 },\n bottomLeft: { x: 10, y: image.height - 10 }\n },\n confidence: 0.95\n };\n }\n\n /**\n * 裁剪并校正图像\n * @param image 图像数据\n * @param edge 边缘信息\n * @returns 校正后的图像\n * @private\n */\n private async cropAndAlign(image: ImageData, edge: IDCardEdge): Promise<ImageData> {\n // 实际项目中,这里应该进行透视变换以校正图像\n this.logger.debug('IDCardDetector', '裁剪并校正图像');\n \n // 创建Canvas\n const canvas = document.createElement('canvas');\n // 设置标准身份证尺寸比例\n canvas.width = 428;\n canvas.height = 270;\n \n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('无法获取Canvas上下文');\n }\n \n // 创建临时Canvas\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = image.width;\n tempCanvas.height = image.height;\n \n const tempContext = tempCanvas.getContext('2d');\n if (!tempContext) {\n throw new Error('无法获取临时Canvas上下文');\n }\n \n // 将ImageData绘制到临时Canvas\n tempContext.putImageData(image, 0, 0);\n \n // 在实际应用中,这里应该使用透视变换算法\n // 例如使用Canvas的transform或WebGL进行变换\n \n // 简化处理:直接裁剪\n context.drawImage(\n tempCanvas,\n edge.topLeft.x,\n edge.topLeft.y,\n edge.topRight.x - edge.topLeft.x,\n edge.bottomLeft.y - edge.topLeft.y,\n 0,\n 0,\n canvas.width,\n canvas.height\n );\n \n return context.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n /**\n * 识别文字\n * @param image 图像数据\n * @param type 身份证类型\n * @returns 识别结果\n * @private\n */\n private async recognizeText(image: ImageData, type: IDCardType): Promise<Partial<IDCardInfo>> {\n // 实际项目中,这里应该调用OCR模型进行文字识别\n this.logger.debug('IDCardDetector', '识别文字');\n \n // 模拟OCR结果\n // 在实际应用中,这里应该使用OCR模型进行文字识别\n if (type === IDCardType.FRONT) {\n return {\n name: '张三',\n gender: '男',\n ethnicity: '汉',\n birthDate: '1990-01-01',\n address: '北京市朝阳区某某街道某某社区1号楼1单元101',\n idNumber: '110101199001010001',\n photoRegion: {\n x: 300,\n y: 40,\n width: 100,\n height: 130\n }\n };\n } else if (type === IDCardType.BACK) {\n return {\n issueAuthority: '北京市公安局朝阳分局',\n validFrom: '2015-01-01',\n validTo: '2035-01-01'\n };\n }\n \n return {};\n }\n\n /**\n * 检测防伪特征\n * @param image 图像数据\n * @param detectionResult 检测结果\n * @returns 防伪检测结果\n * @private\n */\n private async detectAntiFake(\n image: ImageData,\n detectionResult: { type: IDCardType; edge: IDCardEdge; confidence: number }\n ): Promise<IDCardInfo['antiFake']> {\n // 实际项目中,这里应该调用防伪模型进行特征检测\n this.logger.debug('IDCardDetector', '检测防伪特征');\n \n // 模拟防伪检测结果\n // 在实际应用中,这里应该使用机器学习模型检测防伪特征\n return {\n passed: true,\n score: 0.92,\n features: {\n fluorescent: true,\n microtext: true,\n opticalVariable: true,\n texture: true,\n watermark: true\n }\n };\n }\n\n /**\n * 释放资源\n */\n public dispose(): void {\n this.logger.debug('IDCardDetector', '释放资源');\n \n // 清理模型\n this.models = {};\n this.initialized = false;\n \n // 清理事件监听\n this.removeAllListeners();\n }\n} ","/**\n * @file 图像处理工具类\n * @description 提供图像预处理功能,用于提高OCR识别率\n * @module ImageProcessor\n * @version 1.3.2\n */\n\nimport imageCompression from \"browser-image-compression\"\nimport { Point, Rect, ImageProcessingOptions } from './types';\n\n/**\n * 图像处理器配置选项\n */\nexport interface ImageProcessorOptions {\n brightness?: number // 亮度调整,范围 -100 到 100\n contrast?: number // 对比度调整,范围 -100 到 100\n grayscale?: boolean // 是否转换为灰度图\n invert?: boolean // 是否反转颜色\n blur?: number // 模糊程度 (0-10)\n sharpen?: boolean // 是否锐化\n}\n\n/**\n * 图像压缩选项\n */\nexport interface ImageCompressionOptions {\n maxSizeMB?: number // 图片最大大小,MB\n maxWidthOrHeight?: number // 图片最大宽度或高度\n useWebWorker?: boolean // 是否使用Web Worker处理\n maxIteration?: number // 最大压缩迭代次数\n quality?: number // 输出质量 (0-1)\n fileType?: string // 输出文件类型 ('image/jpeg', 'image/png' 等)\n}\n\n/**\n * 图像处理工具类\n *\n * 提供各种图像处理功能,用于优化识别效果\n */\nexport class ImageProcessor {\n /**\n * 将ImageData转换为Canvas元素\n *\n * @param {ImageData} imageData - 要转换的图像数据\n * @returns {HTMLCanvasElement} 包含图像的Canvas元素\n */\n static imageDataToCanvas(imageData: ImageData): HTMLCanvasElement {\n const canvas = document.createElement(\"canvas\")\n canvas.width = imageData.width\n canvas.height = imageData.height\n const ctx = canvas.getContext(\"2d\")\n\n if (ctx) {\n ctx.putImageData(imageData, 0, 0)\n }\n\n return canvas\n }\n\n /**\n * 将Canvas转换为ImageData\n *\n * @param {HTMLCanvasElement} canvas - 要转换的Canvas元素\n * @returns {ImageData|null} Canvas的图像数据,如果获取失败则返回null\n */\n static canvasToImageData(canvas: HTMLCanvasElement): ImageData | null {\n const ctx = canvas.getContext(\"2d\")\n return ctx ? ctx.getImageData(0, 0, canvas.width, canvas.height) : null\n }\n\n /**\n * 调整图像亮度和对比度\n *\n * @param imageData 原始图像数据\n * @param brightness 亮度调整值 (-100到100)\n * @param contrast 对比度调整值 (-100到100)\n * @returns 处理后的图像数据\n */\n static adjustBrightnessContrast(\n imageData: ImageData,\n brightness: number = 0,\n contrast: number = 0\n ): ImageData {\n // 将亮度和对比度范围限制在 -100 到 100 之间\n brightness = Math.max(-100, Math.min(100, brightness))\n contrast = Math.max(-100, Math.min(100, contrast))\n\n // 将范围转换为适合计算的值\n const factor = (259 * (contrast + 255)) / (255 * (259 - contrast))\n const briAdjust = (brightness / 100) * 255\n\n const data = imageData.data\n const length = data.length\n\n for (let i = 0; i < length; i += 4) {\n // 分别处理 RGB 三个通道\n for (let j = 0; j < 3; j++) {\n // 应用亮度和对比度调整公式\n const newValue = factor * (data[i + j] + briAdjust - 128) + 128\n data[i + j] = Math.max(0, Math.min(255, newValue))\n }\n // Alpha 通道保持不变\n }\n\n return imageData\n }\n\n /**\n * 将图像转换为灰度图\n *\n * @param imageData 原始图像数据\n * @returns 灰度图像数据\n */\n static toGrayscale(imageData: ImageData): ImageData {\n const data = imageData.data\n const length = data.length\n\n for (let i = 0; i < length; i += 4) {\n // 使用加权平均法将 RGB 转换为灰度值\n const gray = data[i] * 0.3 + data[i + 1] * 0.59 + data[i + 2] * 0.11\n data[i] = data[i + 1] = data[i + 2] = gray\n }\n\n return imageData\n }\n\n /**\n * 锐化图像\n *\n * @param imageData 原始图像数据\n * @param amount 锐化程度,默认为2\n * @returns 锐化后的图像数据\n */\n static sharpen(imageData: ImageData, amount: number = 2): ImageData {\n if (!imageData || !imageData.data) return imageData\n\n const width = imageData.width\n const height = imageData.height\n const data = imageData.data\n\n const outputData = new Uint8ClampedArray(data.length)\n\n // 锐化卷积核\n const kernel = [\n 0,\n -amount,\n 0,\n -amount,\n 1 + 4 * amount,\n -amount,\n 0,\n -amount,\n 0,\n ]\n\n // 应用卷积\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n const pos = (y * width + x) * 4\n\n // 对每个通道应用卷积\n for (let c = 0; c < 3; c++) {\n let val = 0\n for (let ky = -1; ky <= 1; ky++) {\n for (let kx = -1; kx <= 1; kx++) {\n const kernelPos = (ky + 1) * 3 + (kx + 1)\n const dataPos = ((y + ky) * width + (x + kx)) * 4 + c\n val += data[dataPos] * kernel[kernelPos]\n }\n }\n outputData[pos + c] = Math.max(0, Math.min(255, val))\n }\n outputData[pos + 3] = data[pos + 3] // 保持透明度不变\n }\n }\n\n // 处理边缘像素\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n if (y === 0 || y === height - 1 || x === 0 || x === width - 1) {\n const pos = (y * width + x) * 4\n outputData[pos] = data[pos]\n outputData[pos + 1] = data[pos + 1]\n outputData[pos + 2] = data[pos + 2]\n outputData[pos + 3] = data[pos + 3]\n }\n }\n }\n\n // 创建新的ImageData对象\n return new ImageData(outputData, width, height)\n }\n\n /**\n * 对图像应用阈值操作,增强对比度\n *\n * @param imageData 原始图像数据\n * @param threshold 阈值 (0-255)\n * @returns 处理后的图像数据\n */\n static threshold(imageData: ImageData, threshold: number = 128): ImageData {\n // 先转换为灰度图\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n )\n\n const data = grayscaleImage.data\n const length = data.length\n\n for (let i = 0; i < length; i += 4) {\n // 二值化处理\n const value = data[i] < threshold ? 0 : 255\n data[i] = data[i + 1] = data[i + 2] = value\n }\n\n return grayscaleImage\n }\n\n /**\n * 将图像转换为黑白图像(二值化)\n *\n * @param imageData 原始图像数据\n * @returns 二值化后的图像数据\n */\n static toBinaryImage(imageData: ImageData): ImageData {\n // 先转换为灰度图\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n )\n\n // 使用OTSU算法自动确定阈值\n const threshold = this.getOtsuThreshold(grayscaleImage)\n\n return this.threshold(grayscaleImage, threshold)\n }\n\n /**\n * 使用OTSU算法计算最佳阈值\n *\n * @param imageData 灰度图像数据\n * @returns 最佳阈值\n */\n private static getOtsuThreshold(imageData: ImageData): number {\n const data = imageData.data\n const histogram = new Array(256).fill(0)\n\n // 统计灰度直方图\n for (let i = 0; i < data.length; i += 4) {\n histogram[data[i]]++\n }\n\n const total = imageData.width * imageData.height\n let sum = 0\n\n // 计算总灰度值和\n for (let i = 0; i < 256; i++) {\n sum += i * histogram[i]\n }\n\n let sumB = 0\n let wB = 0\n let wF = 0\n let maxVariance = 0\n let threshold = 0\n\n // 遍历所有可能的阈值,找到最大类间方差\n for (let t = 0; t < 256; t++) {\n wB += histogram[t] // 背景权重\n if (wB === 0) continue\n\n wF = total - wB // 前景权重\n if (wF === 0) break\n\n sumB += t * histogram[t]\n\n const mB = sumB / wB // 背景平均灰度\n const mF = (sum - sumB) / wF // 前景平均灰度\n\n // 计算类间方差\n const variance = wB * wF * (mB - mF) * (mB - mF)\n\n if (variance > maxVariance) {\n maxVariance = variance\n threshold = t\n }\n }\n\n return threshold\n }\n\n /**\n * 批量应用图像处理\n *\n * @param imageData 原始图像数据\n * @param options 处理选项\n * @returns 处理后的图像数据\n */\n static batchProcess(\n imageData: ImageData,\n options: ImageProcessorOptions\n ): ImageData {\n let processedImage = new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n\n // 应用亮度和对比度调整\n if (options.brightness !== undefined || options.contrast !== undefined) {\n processedImage = this.adjustBrightnessContrast(\n processedImage,\n options.brightness || 0,\n options.contrast || 0\n )\n }\n\n // 应用灰度转换\n if (options.grayscale) {\n processedImage = this.toGrayscale(processedImage)\n }\n\n // 应用锐化\n if (options.sharpen) {\n processedImage = this.sharpen(processedImage)\n }\n\n // 应用颜色反转\n if (options.invert) {\n const data = processedImage.data\n for (let i = 0; i < data.length; i += 4) {\n // 反转RGB值\n data[i] = 255 - data[i]\n data[i + 1] = 255 - data[i + 1]\n data[i + 2] = 255 - data[i + 2]\n // Alpha通道保持不变\n }\n }\n\n return processedImage\n }\n\n /**\n * 压缩图片文件\n *\n * @param file 图片文件\n * @param options 压缩选项\n * @returns Promise<File> 压缩后的文件\n */\n static async compressImage(\n file: File,\n options?: ImageCompressionOptions\n ): Promise<File> {\n const defaultOptions = {\n maxSizeMB: 1,\n maxWidthOrHeight: 1920,\n useWebWorker: true,\n quality: 0.8,\n fileType: file.type || \"image/jpeg\",\n }\n\n const compressOptions = { ...defaultOptions, ...options }\n\n try {\n return await imageCompression(file, compressOptions)\n } catch (error) {\n console.error(\"图片压缩失败:\", error)\n return file // 如果压缩失败,返回原始文件\n }\n }\n\n /**\n * 从图片文件创建ImageData\n *\n * @param file 图片文件\n * @returns Promise<ImageData>\n */\n static async createImageDataFromFile(file: File): Promise<ImageData> {\n return new Promise((resolve, reject) => {\n try {\n const img = new Image()\n const url = URL.createObjectURL(file)\n\n img.onload = () => {\n try {\n // 创建canvas元素\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")\n\n if (!ctx) {\n reject(new Error(\"无法创建2D上下文\"))\n return\n }\n\n canvas.width = img.width\n canvas.height = img.height\n\n // 绘制图片到canvas\n ctx.drawImage(img, 0, 0)\n\n // 获取图像数据\n const imageData = ctx.getImageData(\n 0,\n 0,\n canvas.width,\n canvas.height\n )\n\n // 释放资源\n URL.revokeObjectURL(url)\n\n resolve(imageData)\n } catch (e) {\n reject(e)\n }\n }\n\n img.onerror = () => {\n URL.revokeObjectURL(url)\n reject(new Error(\"图片加载失败\"))\n }\n\n img.src = url\n } catch (error) {\n reject(error)\n }\n })\n }\n\n /**\n * 将ImageData转换为File对象\n *\n * @param imageData ImageData对象\n * @param fileName 输出文件名\n * @param fileType 输出文件类型\n * @param quality 图片质量 (0-1)\n * @returns Promise<File>\n */\n static async imageDataToFile(\n imageData: ImageData,\n fileName: string = \"image.jpg\",\n fileType: string = \"image/jpeg\",\n quality: number = 0.8\n ): Promise<File> {\n return new Promise((resolve, reject) => {\n try {\n const canvas = document.createElement(\"canvas\")\n canvas.width = imageData.width\n canvas.height = imageData.height\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) {\n reject(new Error(\"无法创建2D上下文\"))\n return\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"无法创建图片Blob\"))\n return\n }\n const file = new File([blob], fileName, { type: fileType })\n resolve(file)\n },\n fileType,\n quality\n )\n } catch (error) {\n reject(error)\n }\n })\n }\n\n /**\n * 将图像调整到指定大小\n * @param image 输入图像\n * @param maxWidth 最大宽度\n * @param maxHeight 最大高度\n * @param keepAspectRatio 是否保持宽高比\n * @returns 调整后的图像\n */\n public static resizeImage(\n image: ImageData | HTMLImageElement | HTMLCanvasElement,\n maxWidth: number,\n maxHeight: number,\n keepAspectRatio: boolean = true\n ): ImageData {\n // 创建canvas元素\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) {\n throw new Error('无法创建Canvas上下文');\n }\n \n // 获取图像尺寸\n let width: number;\n let height: number;\n \n if (image instanceof ImageData) {\n width = image.width;\n height = image.height;\n } else {\n width = image.width;\n height = image.height;\n }\n \n // 计算调整后的尺寸\n let newWidth = width;\n let newHeight = height;\n \n if (keepAspectRatio) {\n if (width > height) {\n if (width > maxWidth) {\n newHeight = Math.round(height * (maxWidth / width));\n newWidth = maxWidth;\n }\n } else {\n if (height > maxHeight) {\n newWidth = Math.round(width * (maxHeight / height));\n newHeight = maxHeight;\n }\n }\n } else {\n newWidth = Math.min(width, maxWidth);\n newHeight = Math.min(height, maxHeight);\n }\n \n // 设置canvas尺寸\n canvas.width = newWidth;\n canvas.height = newHeight;\n \n // 绘制调整后的图像\n if (image instanceof ImageData) {\n // 创建临时canvas存储ImageData\n const tempCanvas = document.createElement('canvas');\n const tempCtx = tempCanvas.getContext('2d');\n \n if (!tempCtx) {\n throw new Error('无法创建临时Canvas上下文');\n }\n\n tempCanvas.width = image.width;\n tempCanvas.height = image.height;\n tempCtx.putImageData(image, 0, 0);\n \n // 绘制调整后的图像\n ctx.drawImage(tempCanvas, 0, 0, width, height, 0, 0, newWidth, newHeight);\n } else {\n ctx.drawImage(image, 0, 0, width, height, 0, 0, newWidth, newHeight);\n }\n\n // 返回调整后的ImageData\n return ctx.getImageData(0, 0, newWidth, newHeight);\n }\n \n /**\n * 边缘检测算法,用于识别图像中的边缘\n * 基于Sobel算子实现\n * \n * @param imageData 原始图像数据,应已转为灰度图\n * @param threshold 边缘阈值,默认为30\n * @returns 检测到边缘的图像数据\n */\n static detectEdges(imageData: ImageData, threshold: number = 30): ImageData {\n // 确保输入图像是灰度图\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n );\n \n const width = grayscaleImage.width;\n const height = grayscaleImage.height;\n const inputData = grayscaleImage.data;\n const outputData = new Uint8ClampedArray(inputData.length);\n \n // Sobel算子 - 水平和垂直方向\n const sobelX = [-1, 0, 1, -2, 0, 2, -1, 0, 1];\n const sobelY = [-1, -2, -1, 0, 0, 0, 1, 2, 1];\n \n // 对每个像素应用Sobel算子\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n let gx = 0;\n let gy = 0;\n \n // 应用卷积\n for (let ky = -1; ky <= 1; ky++) {\n for (let kx = -1; kx <= 1; kx++) {\n const pixelPos = ((y + ky) * width + (x + kx)) * 4;\n const pixelVal = inputData[pixelPos]; // 灰度值\n \n const kernelIdx = (ky + 1) * 3 + (kx + 1);\n gx += pixelVal * sobelX[kernelIdx];\n gy += pixelVal * sobelY[kernelIdx];\n }\n }\n \n // 计算梯度强度\n let magnitude = Math.sqrt(gx * gx + gy * gy);\n \n // 应用阈值\n magnitude = magnitude > threshold ? 255 : 0;\n \n // 设置输出像素\n const pos = (y * width + x) * 4;\n outputData[pos] = outputData[pos + 1] = outputData[pos + 2] = magnitude;\n outputData[pos + 3] = 255; // 透明度保持完全不透明\n }\n }\n \n // 处理边缘像素\n for (let i = 0; i < width * 4; i++) {\n // 顶部和底部行\n outputData[i] = 0;\n outputData[(height - 1) * width * 4 + i] = 0;\n }\n \n for (let i = 0; i < height; i++) {\n // 左右两侧列\n const leftPos = i * width * 4;\n const rightPos = (i * width + width - 1) * 4;\n \n for (let j = 0; j < 4; j++) {\n outputData[leftPos + j] = 0;\n outputData[rightPos + j] = 0;\n }\n }\n \n return new ImageData(outputData, width, height);\n }\n \n /**\n * 卡尼-德里奇边缘检测\n * 相比Sobel更精确的边缘检测算法\n * \n * @param imageData 灰度图像数据\n * @param lowThreshold 低阈值\n * @param highThreshold 高阈值\n * @returns 边缘检测结果\n */\n static cannyEdgeDetection(\n imageData: ImageData, \n lowThreshold: number = 20, \n highThreshold: number = 50\n ): ImageData {\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n );\n \n // 1. 高斯模糊\n const blurredImage = this.gaussianBlur(grayscaleImage, 1.5);\n \n // 2. 使用Sobel算子计算梯度\n const { gradientMagnitude, gradientDirection } = this.computeGradients(blurredImage);\n \n // 3. 非极大值抛弃\n const nonMaxSuppressed = this.nonMaxSuppression(gradientMagnitude, gradientDirection, blurredImage.width, blurredImage.height);\n \n // 4. 双阈值处理\n const thresholdResult = this.hysteresisThresholding(\n nonMaxSuppressed, \n blurredImage.width, \n blurredImage.height, \n lowThreshold, \n highThreshold\n );\n \n // 创建输出图像\n const outputData = new Uint8ClampedArray(imageData.data.length);\n \n // 将结果转换为ImageData\n for (let i = 0; i < thresholdResult.length; i++) {\n const pos = i * 4;\n const value = thresholdResult[i] ? 255 : 0;\n outputData[pos] = outputData[pos + 1] = outputData[pos + 2] = value;\n outputData[pos + 3] = 255;\n }\n \n return new ImageData(outputData, blurredImage.width, blurredImage.height);\n }\n \n /**\n * 高斯模糊\n */\n private static gaussianBlur(imageData: ImageData, sigma: number = 1.5): ImageData {\n const width = imageData.width;\n const height = imageData.height;\n const inputData = imageData.data;\n const outputData = new Uint8ClampedArray(inputData.length);\n \n // 生成高斯核\n const kernelSize = Math.max(3, Math.floor(sigma * 3) * 2 + 1);\n const halfKernel = Math.floor(kernelSize / 2);\n const kernel = this.generateGaussianKernel(kernelSize, sigma);\n \n // 应用高斯核\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n let sum = 0;\n let weightSum = 0;\n \n for (let ky = -halfKernel; ky <= halfKernel; ky++) {\n for (let kx = -halfKernel; kx <= halfKernel; kx++) {\n const pixelY = Math.min(Math.max(y + ky, 0), height - 1);\n const pixelX = Math.min(Math.max(x + kx, 0), width - 1);\n const pixelPos = (pixelY * width + pixelX) * 4;\n \n const kernelY = ky + halfKernel;\n const kernelX = kx + halfKernel;\n const weight = kernel[kernelY * kernelSize + kernelX];\n \n sum += inputData[pixelPos] * weight;\n weightSum += weight;\n }\n }\n \n const pos = (y * width + x) * 4;\n const value = Math.round(sum / weightSum);\n outputData[pos] = outputData[pos + 1] = outputData[pos + 2] = value;\n outputData[pos + 3] = 255;\n }\n }\n \n return new ImageData(outputData, width, height);\n }\n \n /**\n * 生成高斯核\n */\n private static generateGaussianKernel(size: number, sigma: number): number[] {\n const kernel = new Array(size * size);\n const center = Math.floor(size / 2);\n let sum = 0;\n \n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const distance = Math.sqrt((x - center) ** 2 + (y - center) ** 2);\n const value = Math.exp(-(distance ** 2) / (2 * sigma ** 2));\n \n kernel[y * size + x] = value;\n sum += value;\n }\n }\n \n // 归一化\n for (let i = 0; i < kernel.length; i++) {\n kernel[i] /= sum;\n }\n \n return kernel;\n }\n \n /**\n * 计算梯度强度和方向\n */\n private static computeGradients(imageData: ImageData): { \n gradientMagnitude: number[], \n gradientDirection: number[] \n } {\n const width = imageData.width;\n const height = imageData.height;\n const inputData = imageData.data;\n \n const gradientMagnitude = new Array(width * height);\n const gradientDirection = new Array(width * height);\n \n // Sobel算子\n const sobelX = [-1, 0, 1, -2, 0, 2, -1, 0, 1];\n const sobelY = [-1, -2, -1, 0, 0, 0, 1, 2, 1];\n \n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n let gx = 0;\n let gy = 0;\n \n for (let ky = -1; ky <= 1; ky++) {\n for (let kx = -1; kx <= 1; kx++) {\n const pixelPos = ((y + ky) * width + (x + kx)) * 4;\n const pixelVal = inputData[pixelPos];\n \n const kernelIdx = (ky + 1) * 3 + (kx + 1);\n gx += pixelVal * sobelX[kernelIdx];\n gy += pixelVal * sobelY[kernelIdx];\n }\n }\n \n const idx = y * width + x;\n gradientMagnitude[idx] = Math.sqrt(gx * gx + gy * gy);\n gradientDirection[idx] = Math.atan2(gy, gx);\n }\n }\n \n // 处理边界\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n if (y === 0 || y === height - 1 || x === 0 || x === width - 1) {\n const idx = y * width + x;\n gradientMagnitude[idx] = 0;\n gradientDirection[idx] = 0;\n }\n }\n }\n \n return { gradientMagnitude, gradientDirection };\n }\n \n /**\n * 非极大值抛弃\n */\n private static nonMaxSuppression(\n gradientMagnitude: number[], \n gradientDirection: number[], \n width: number, \n height: number\n ): number[] {\n const result = new Array(width * height).fill(0);\n \n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n const idx = y * width + x;\n const magnitude = gradientMagnitude[idx];\n const direction = gradientDirection[idx];\n \n // 将方向转化为角度\n const degrees = (direction * 180 / Math.PI + 180) % 180;\n \n // 获取相邻像素索引\n let neighbor1Idx, neighbor2Idx;\n \n // 将方向量化为四个方向: 0°, 45°, 90°, 135°\n if ((degrees >= 0 && degrees < 22.5) || (degrees >= 157.5 && degrees <= 180)) {\n // 水平方向\n neighbor1Idx = idx - 1;\n neighbor2Idx = idx + 1;\n } else if (degrees >= 22.5 && degrees < 67.5) {\n // 45度方向\n neighbor1Idx = (y - 1) * width + (x + 1);\n neighbor2Idx = (y + 1) * width + (x - 1);\n } else if (degrees >= 67.5 && degrees < 112.5) {\n // 垂直方向\n neighbor1Idx = (y - 1) * width + x;\n neighbor2Idx = (y + 1) * width + x;\n } else {\n // 135度方向\n neighbor1Idx = (y - 1) * width + (x - 1);\n neighbor2Idx = (y + 1) * width + (x + 1);\n }\n \n // 检查当前像素是否是最大值\n if (magnitude >= gradientMagnitude[neighbor1Idx] && \n magnitude >= gradientMagnitude[neighbor2Idx]) {\n result[idx] = magnitude;\n }\n }\n }\n \n return result;\n }\n \n /**\n * 双阈值处理\n */\n private static hysteresisThresholding(\n nonMaxSuppressed: number[], \n width: number, \n height: number, \n lowThreshold: number, \n highThreshold: number\n ): boolean[] {\n const result = new Array(width * height).fill(false);\n const visited = new Array(width * height).fill(false);\n const stack = [];\n \n // 标记强边缘点\n for (let i = 0; i < nonMaxSuppressed.length; i++) {\n if (nonMaxSuppressed[i] >= highThreshold) {\n result[i] = true;\n stack.push(i);\n visited[i] = true;\n }\n }\n \n // 使用深度优先搜索连接弱边缘\n const dx = [-1, 0, 1, -1, 1, -1, 0, 1];\n const dy = [-1, -1, -1, 0, 0, 1, 1, 1];\n \n while (stack.length > 0) {\n const currentIdx: number = stack.pop()!;\n const currentX: number = currentIdx % width;\n const currentY: number = Math.floor(currentIdx / width);\n \n // 检查88个相邻方向\n for (let i = 0; i < 8; i++) {\n const newX: number = currentX + dx[i];\n const newY: number = currentY + dy[i];\n \n if (newX >= 0 && newX < width && newY >= 0 && newY < height) {\n const newIdx: number = newY * width + newX;\n \n if (!visited[newIdx] && nonMaxSuppressed[newIdx] >= lowThreshold) {\n result[newIdx] = true;\n stack.push(newIdx);\n visited[newIdx] = true;\n }\n }\n }\n }\n \n return result;\n }\n}\n","/**\n * @file 性能优化工具\n * @description 提供性能优化相关的工具函数\n * @module utils/performance\n */\n\n/**\n * LRU缓存实现\n */\nexport class LRUCache<K, V> {\n private capacity: number;\n private cache: Map<K, V>;\n\n /**\n * 构造函数\n * @param capacity 缓存容量\n */\n constructor(capacity: number = 100) {\n this.capacity = capacity;\n this.cache = new Map<K, V>();\n }\n\n /**\n * 获取缓存项\n * @param key 键\n * @returns 值,如果不存在则返回undefined\n */\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined;\n }\n\n // 获取值\n const value = this.cache.get(key)!;\n \n // 删除旧位置\n this.cache.delete(key);\n\n // 添加到最新位置\n this.cache.set(key, value);\n\n return value;\n }\n\n /**\n * 设置缓存项\n * @param key 键\n * @param value 值\n */\n set(key: K, value: V): void {\n // 如果已存在,先删除\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n // 如果缓存已满,删除最旧的项\n else if (this.cache.size >= this.capacity) {\n this.cache.delete(this.cache.keys().next().value as K);\n }\n\n // 添加新项\n this.cache.set(key, value);\n }\n \n /**\n * 检查键是否存在\n * @param key 键\n * @returns 是否存在\n */\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n /**\n * 删除缓存项\n * @param key 键\n * @returns 是否成功删除\n */\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * 清空缓存\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * 获取缓存大小\n */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * 获取所有键\n */\n keys(): IterableIterator<K> {\n return this.cache.keys();\n }\n \n /**\n * 获取所有值\n */\n values(): IterableIterator<V> {\n return this.cache.values();\n }\n \n /**\n * 获取所有项\n */\n entries(): IterableIterator<[K, V]> {\n return this.cache.entries();\n }\n}\n\n/**\n * 计算图像指纹\n * @param imageData 图像数据\n * @returns 图像指纹\n */\nexport function calculateImageFingerprint(imageData: ImageData): string {\n const { width, height, data } = imageData;\n \n // 缩小图像以加快计算速度\n const scale = Math.min(1, 32 / Math.max(width, height));\n const scaledWidth = Math.max(8, Math.floor(width * scale));\n const scaledHeight = Math.max(8, Math.floor(height * scale));\n \n // 创建缩小的图像\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('无法创建Canvas上下文');\n }\n \n // 设置canvas尺寸\n canvas.width = scaledWidth;\n canvas.height = scaledHeight;\n\n // 创建临时canvas存储原始ImageData\n const tempCanvas = document.createElement('canvas');\n const tempCtx = tempCanvas.getContext('2d');\n\n if (!tempCtx) {\n throw new Error('无法创建临时Canvas上下文');\n }\n\n tempCanvas.width = width;\n tempCanvas.height = height;\n tempCtx.putImageData(imageData, 0, 0);\n \n // 绘制缩小的图像\n ctx.drawImage(tempCanvas, 0, 0, width, height, 0, 0, scaledWidth, scaledHeight);\n \n // 获取缩小的图像数据\n const scaledImageData = ctx.getImageData(0, 0, scaledWidth, scaledHeight);\n \n // 计算灰度值\n const grayValues = new Uint8Array(scaledWidth * scaledHeight);\n\n for (let i = 0; i < scaledWidth * scaledHeight; i++) {\n const idx = i * 4;\n grayValues[i] = Math.round(\n 0.299 * scaledImageData.data[idx] +\n 0.587 * scaledImageData.data[idx + 1] +\n 0.114 * scaledImageData.data[idx + 2]\n );\n }\n \n // 计算平均值\n let sum = 0;\n for (let i = 0; i < grayValues.length; i++) {\n sum += grayValues[i];\n }\n const avg = sum / grayValues.length;\n \n // 计算哈希值\n let hash = '';\n for (let i = 0; i < grayValues.length; i++) {\n hash += grayValues[i] >= avg ? '1' : '0';\n }\n \n return hash;\n }\n\n/**\n * 防抖函数\n * @param func 要执行的函数\n * @param wait 等待时间(毫秒)\n * @returns 防抖处理后的函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: number | null = null;\n \n return function(this: any, ...args: Parameters<T>): void {\n const later = () => {\n timeout = null;\n func.apply(this, args);\n };\n \n if (timeout !== null) {\n clearTimeout(timeout);\n }\n \n timeout = window.setTimeout(later, wait) as unknown as number;\n };\n}\n\n/**\n * 节流函数\n * @param func 要执行的函数\n * @param limit 时间限制(毫秒)\n * @returns 节流处理后的函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle = false;\n let lastFunc: number | null = null;\n let lastRan: number | null = null;\n \n return function(this: any, ...args: Parameters<T>): void {\n if (!inThrottle) {\n func.apply(this, args);\n lastRan = Date.now();\n inThrottle = true;\n } else {\n if (lastFunc !== null) {\n clearTimeout(lastFunc);\n }\n \n lastFunc = window.setTimeout(() => {\n if (lastRan !== null && Date.now() - lastRan >= limit) {\n func.apply(this, args);\n lastRan = Date.now();\n }\n }, limit - (lastRan !== null ? Date.now() - lastRan : 0)) as unknown as number;\n }\n };\n}\n","/**\n * @file Worker工具\n * @description 提供Web Worker相关的工具函数\n * @module utils/worker\n */\n\n/**\n * 检查是否支持Web Worker\n * @returns 是否支持Web Worker\n */\nexport function isWorkerSupported(): boolean {\n return typeof Worker !== 'undefined';\n}\n\n/**\n * 创建Worker\n * @param workerFunction Worker函数\n * @returns Worker实例\n */\nexport function createWorker<TInput, TOutput>(\n workerFunction: (input: TInput) => TOutput | Promise<TOutput>\n): {\n postMessage: (input: TInput) => Promise<TOutput>;\n terminate: () => void;\n} {\n // 检查是否支持Web Worker\n if (!isWorkerSupported()) {\n // 回退到主线程执行\n return {\n postMessage: async (input: TInput) => {\n return await Promise.resolve(workerFunction(input));\n },\n terminate: () => {}\n };\n }\n \n // 将函数转换为字符串\n const workerFunctionStr = workerFunction.toString();\n \n // 创建Worker脚本\n const workerScript = `\n // 定义Worker函数\n const workerFunction = ${workerFunctionStr};\n \n // 监听消息\n self.addEventListener('message', async (event) => {\n try {\n const input = event.data;\n const result = await workerFunction(input);\n self.postMessage({ success: true, result });\n } catch (error) {\n self.postMessage({ \n success: false, \n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n `;\n \n // 创建Blob URL\n const blob = new Blob([workerScript], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n \n // 创建Worker\n const worker = new Worker(url);\n\n // 创建Promise映射\n const promiseMap = new Map<number, {\n resolve: (value: TOutput) => void;\n reject: (reason: any) => void;\n }>();\n \n // 消息计数器\n let messageCounter = 0;\n \n // 监听Worker消息\n worker.addEventListener('message', (event) => {\n const { messageId, success, result, error } = event.data;\n \n // 查找对应的Promise\n const promiseHandlers = promiseMap.get(messageId);\n if (promiseHandlers) {\n if (success) {\n promiseHandlers.resolve(result);\n } else {\n promiseHandlers.reject(new Error(error));\n }\n \n // 删除Promise映射\n promiseMap.delete(messageId);\n }\n });\n\n // 返回Worker接口\n return {\n postMessage: (input: TInput): Promise<TOutput> => {\n return new Promise<TOutput>((resolve, reject) => {\n // 生成消息ID\n const messageId = messageCounter++;\n \n // 保存Promise处理函数\n promiseMap.set(messageId, { resolve, reject });\n \n // 发送消息到Worker\n worker.postMessage({ messageId, input });\n });\n },\n terminate: () => {\n // 终止Worker\n worker.terminate();\n \n // 释放Blob URL\n URL.revokeObjectURL(url);\n \n // 拒绝所有未完成的Promise\n for (const [, { reject }] of promiseMap) {\n reject(new Error('Worker已终止'));\n }\n \n // 清空Promise映射\n promiseMap.clear();\n }\n };\n}\n\n/**\n * 工作线程池\n * 用于管理和重用Worker线程,避免频繁创建和销毁\n */\nexport class WorkerPool<T, R> {\n private workers: Array<{\n worker: ReturnType<typeof createWorker<T, R>>\n busy: boolean\n }> = []\n\n /**\n * 创建工作线程池\n *\n * @param workerFunction 要在Worker中执行的函数\n * @param size 池中Worker的数量\n */\n constructor(\n private workerFunction: (data: T) => Promise<R> | R,\n private size: number = navigator.hardwareConcurrency || 4\n ) {\n // 更精确的 workerFunction 类型\n // 预创建Workers\n for (let i = 0; i < size; i++) {\n this.workers.push({\n worker: createWorker<T, R>(workerFunction),\n busy: false,\n })\n }\n }\n\n /**\n * 获取一个可用的Worker\n *\n * @returns Worker包装对象\n */\n private getAvailableWorker(): ReturnType<typeof createWorker<T, R>> {\n // 找到第一个空闲的Worker\n const availableWorker = this.workers.find((w) => !w.busy)\n\n if (availableWorker) {\n availableWorker.busy = true\n return availableWorker.worker\n }\n\n // 如果没有空闲Worker,创建一个新的\n const worker = createWorker<T, R>(this.workerFunction)\n this.workers.push({ worker, busy: true })\n return worker\n }\n\n /**\n * 执行任务\n *\n * @param data 要处理的数据\n * @returns 处理结果的Promise\n */\n async execute(data: T): Promise<R> {\n const worker = this.getAvailableWorker()\n\n try {\n const result = await worker.postMessage(data)\n // 标记Worker为空闲\n const workerEntry = this.workers.find((w) => w.worker === worker)\n if (workerEntry) {\n workerEntry.busy = false\n }\n return result\n } catch (error) {\n // 出错时也标记为空闲\n const workerEntry = this.workers.find((w) => w.worker === worker)\n if (workerEntry) {\n workerEntry.busy = false\n }\n throw error\n }\n }\n\n /**\n * 终止所有Worker\n */\n terminate(): void {\n this.workers.forEach(({ worker }) => {\n worker.terminate()\n })\n this.workers = []\n }\n}\n","/**\n * @file OCR Worker\n * @description OCR处理的Worker线程实现\n * @module modules/id-card/ocr-worker\n */\n\nimport { IDCardInfo, IDCardType } from './types';\nimport { LoggerMessage } from 'tesseract.js';\n\n/**\n * OCR处理输入参数\n */\nexport interface OCRProcessInput {\n /** 图像Base64数据 */\n imageBase64: string;\n /** Tesseract Worker选项 */\n tessWorkerOptions?: {\n /** 语言 */\n language?: string;\n /** 日志回调 */\n logger?: (message: LoggerMessage) => void;\n };\n}\n\n/**\n * 在Worker中处理OCR识别\n * @param input OCR处理输入参数\n * @returns OCR处理结果\n */\nexport async function processOCRInWorker(\n input: OCRProcessInput\n): Promise<{ idCardInfo: IDCardInfo; processingTime: number }> {\n const startTime = performance.now();\n\n try {\n // 导入Tesseract.js\n const { createWorker } = await import('tesseract.js');\n\n // 创建Tesseract Worker\n const worker = createWorker({\n logger: input.tessWorkerOptions?.logger\n });\n\n // 初始化Worker\n await worker.load();\n await worker.loadLanguage('chi_sim');\n await worker.initialize('chi_sim');\n\n // 设置识别参数\n await worker.setParameters({\n tessedit_char_whitelist: '0123456789X年月日壹贰叁肆伍陆柒捌玖拾民族汉满回维吾尔藏苗彝壮朝鲜侗瑶白土家哈尼哈萨克傣黎傈僳佤高山拉祜水东乡纳西景颇柯尔克孜达斡尔仫佬羌布朗撒拉毛南仡佬锡伯阿昌普米塔吉克怒乌孜别克俄罗斯鄂温克德昂保安裕固京塔塔尔独龙鄂伦春赫哲门巴珞巴基诺男女住址出生公民身份号码签发机关有效期省市区县乡镇街道号楼单元室ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n tessedit_pageseg_mode: 7, // PSM_SINGLE_LINE\n preserve_interword_spaces: '1'\n });\n\n // 识别图像\n const { data } = await worker.recognize(input.imageBase64);\n\n // 解析身份证信息\n const idCardInfo = parseIDCardText(data.text);\n\n // 释放Worker资源\n await worker.terminate();\n\n const processingTime = performance.now() - startTime;\n\n return { idCardInfo, processingTime };\n } catch (error) {\n console.error('OCR处理错误:', error);\n return {\n idCardInfo: {} as IDCardInfo,\n processingTime: performance.now() - startTime\n };\n }\n}\n\n/**\n * 解析身份证文本\n * @param text OCR识别的文本\n * @returns 解析后的身份证信息\n */\nfunction parseIDCardText(text: string): IDCardInfo {\n const info: IDCardInfo = {};\n\n // 预处理文本,清除多余空白\n const processedText = text.replace(/\\s+/g, ' ').trim();\n\n // 解析身份证号码\n const idNumberRegex = /(\\d{17}[\\dX])/;\n const idNumberWithPrefixRegex = /公民身份号码[\\s\\:]*(\\d{17}[\\dX])/;\n\n const basicMatch = processedText.match(idNumberRegex);\n const prefixMatch = processedText.match(idNumberWithPrefixRegex);\n\n if (prefixMatch && prefixMatch[1]) {\n info.idNumber = prefixMatch[1];\n } else if (basicMatch && basicMatch[1]) {\n info.idNumber = basicMatch[1];\n }\n\n // 解析姓名\n const nameWithLabelRegex = /姓名[\\s\\:]*([一-龥]{2,4})/;\n const nameMatch = processedText.match(nameWithLabelRegex);\n\n if (nameMatch && nameMatch[1]) {\n info.name = nameMatch[1].trim();\n } else {\n // 备用方案:查找短行且内容全是汉字\n const lines = processedText.split('\\n').filter(line => line.trim());\n for (const line of lines) {\n if (\n line.length >= 2 &&\n line.length <= 5 &&\n /^[一-龥]+$/.test(line) &&\n !/性别|民族|住址|公民|签发|有效/.test(line)\n ) {\n info.name = line.trim();\n break;\n }\n }\n }\n\n // 解析性别和民族\n const genderAndNationalityRegex = /性别[\\s\\:]*([男女])[\\s ]*民族[\\s\\:]*([一-龥]+族)/;\n const genderOnlyRegex = /性别[\\s\\:]*([男女])/;\n const nationalityOnlyRegex = /民族[\\s\\:]*([一-龥]+族)/;\n\n const genderNationalityMatch = processedText.match(genderAndNationalityRegex);\n const genderOnlyMatch = processedText.match(genderOnlyRegex);\n const nationalityOnlyMatch = processedText.match(nationalityOnlyRegex);\n\n if (genderNationalityMatch) {\n info.gender = genderNationalityMatch[1];\n info.ethnicity = genderNationalityMatch[2];\n } else {\n if (genderOnlyMatch) info.gender = genderOnlyMatch[1];\n if (nationalityOnlyMatch) info.ethnicity = nationalityOnlyMatch[1];\n }\n\n // 根据内容判断身份证类型\n if (processedText.includes('出生') || processedText.includes('公民身份号码')) {\n info.type = IDCardType.FRONT; // 确保类型为枚举值而不是字符串\n } else if (processedText.includes('签发机关') || processedText.includes('有效期')) {\n info.type = IDCardType.BACK; // 确保类型为枚举值而不是字符串\n }\n\n // 解析出生日期\n const birthDateRegex1 = /出生[\\s\\:]*(\\d{4})年(\\d{1,2})月(\\d{1,2})[日号]/;\n const birthDateRegex2 = /出生[\\s\\:]*(\\d{4})[-\\/\\.](\\d{1,2})[-\\/\\.](\\d{1,2})/;\n const birthDateRegex3 = /出生日期[\\s\\:]*(\\d{4})[-\\/\\.\\u5e74](\\d{1,2})[-\\/\\.\\u6708](\\d{1,2})[日号]?/;\n\n const birthDateMatch =\n processedText.match(birthDateRegex1) ||\n processedText.match(birthDateRegex2) ||\n processedText.match(birthDateRegex3);\n\n if (!birthDateMatch && info.idNumber && info.idNumber.length === 18) {\n const year = info.idNumber.substring(6, 10);\n const month = info.idNumber.substring(10, 12);\n const day = info.idNumber.substring(12, 14);\n info.birthDate = `${year}-${month}-${day}`;\n } else if (birthDateMatch) {\n const year = birthDateMatch[1];\n const month = birthDateMatch[2].padStart(2, '0');\n const day = birthDateMatch[3].padStart(2, '0');\n info.birthDate = `${year}-${month}-${day}`;\n }\n\n // 解析地址\n const addressRegex1 = /住址[\\s\\:]*([\\s\\S]*?)(?=公民身份|出生|性别|签发)/;\n const addressRegex2 = /住址[\\s\\:]*([一-龥a-zA-Z0-9\\s\\.\\-]+)/;\n\n const addressMatch =\n processedText.match(addressRegex1) || processedText.match(addressRegex2);\n\n if (addressMatch && addressMatch[1]) {\n info.address = addressMatch[1]\n .replace(/\\s+/g, '')\n .replace(/\\n/g, '')\n .trim();\n\n if (info.address.length > 70) {\n info.address = info.address.substring(0, 70);\n }\n\n if (!/[一-龥]/.test(info.address)) {\n info.address = '';\n }\n }\n\n // 解析签发机关\n const authorityRegex1 = /签发机关[\\s\\:]*([\\s\\S]*?)(?=有效|公民|出生|\\d{8}|$)/;\n const authorityRegex2 = /签发机关[\\s\\:]*([一-龥\\s]+)/;\n\n const authorityMatch =\n processedText.match(authorityRegex1) ||\n processedText.match(authorityRegex2);\n\n if (authorityMatch && authorityMatch[1]) {\n info.issueAuthority = authorityMatch[1]\n .replace(/\\s+/g, '')\n .replace(/\\n/g, '')\n .trim();\n }\n\n // 解析有效期限\n const validPeriodRegex1 = /有效期限[\\s\\:]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日\\s]*)[-\\s]*(至|-)[-\\s]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日]*|[永久长期]*)/;\n const validPeriodRegex2 = /有效期限[\\s\\:]*(\\d{8})[-\\s]*(至|-)[-\\s]*(\\d{8}|[永久长期]*)/;\n\n const validPeriodMatch =\n processedText.match(validPeriodRegex1) ||\n processedText.match(validPeriodRegex2);\n\n if (validPeriodMatch) {\n if (validPeriodMatch[1] && validPeriodMatch[3]) {\n const startDate = formatDateString(validPeriodMatch[1]);\n const endDate = /\\d/.test(validPeriodMatch[3])\n ? formatDateString(validPeriodMatch[3])\n : '长期有效';\n\n info.validFrom = startDate;\n info.validTo = endDate;\n info.validPeriod = `${startDate}-${endDate}`;\n } else {\n info.validPeriod = validPeriodMatch[0].replace('有效期限', '').trim();\n }\n }\n\n return info;\n}\n\n/**\n * 格式化日期字符串\n * @param dateStr 原始日期字符串\n * @returns 格式化后的日期字符串\n */\nfunction formatDateString(dateStr: string): string {\n // 提取年月日\n const dateMatch = dateStr.match(\n /(\\d{4})[-\\.\\u5e74\\s]*(\\d{1,2})[-\\.\\u6708\\s]*(\\d{1,2})[日]*/\n );\n if (dateMatch) {\n const year = dateMatch[1];\n const month = dateMatch[2].padStart(2, '0');\n const day = dateMatch[3].padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n // 纯数字格式如 20220101\n if (/^\\d{8}$/.test(dateStr)) {\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 6);\n const day = dateStr.substring(6, 8);\n return `${year}-${month}-${day}`;\n }\n\n // 无法格式化,返回原始字符串\n return dateStr;\n}\n","/**\n * @file OCR处理器\n * @description 提供身份证OCR识别功能\n * @module modules/id-card/ocr-processor\n */\n\nimport { EventEmitter } from '../../core/event-emitter';\nimport { Logger } from '../../core/logger';\nimport { IDCardType, IDCardInfo } from './types';\nimport {\n createWorker,\n Worker as TesseractWorker,\n LoggerMessage,\n WorkerOptions,\n} from \"tesseract.js\" // 导入 Worker 和 LoggerMessage 类型\nimport { ImageProcessor } from \"../../utils/image-processing\"\nimport { LRUCache, calculateImageFingerprint } from \"../../utils/performance\"\nimport {\n isWorkerSupported,\n createWorker as createCustomWorker,\n} from \"../../utils/worker\" \nimport { processOCRInWorker, OCRProcessInput } from \"./ocr-worker\"\nimport { Disposable } from \"../../utils/resource-manager\"\n\n// 自定义日志函数类型,兼容字符串和LoggerMessage\ntype LoggerFunction = ((message: string | LoggerMessage) => void) | undefined;\n\n/**\n * OCR处理器选项接口\n */\nexport interface OCRProcessorOptions {\n language?: string\n useWorker?: boolean\n maxImageDimension?: number\n timeout?: number\n brightness?: number // 新增亮度参数\n contrast?: number // 新增对比度参数\n onProgress?: (progress: number) => void\n enableCache?: boolean // 添加启用缓存选项\n cacheSize?: number // 添加缓存大小选项\n logger?: LoggerFunction // 修改为兼容字符串的日志函数类型\n}\n\n/**\n * OCR处理器类\n *\n * 使用Tesseract.js实现对身份证图像的OCR文字识别和信息提取功能\n *\n * @example\n * ```typescript\n * // 创建OCR处理器\n * const ocrProcessor = new OCRProcessor();\n *\n * // 初始化OCR引擎\n * await ocrProcessor.initialize();\n *\n * // 处理身份证图像\n * const idInfo = await ocrProcessor.processIDCard(idCardImageData);\n * console.log('识别到的身份证信息:', idInfo);\n *\n * // 使用结束后释放资源\n * await ocrProcessor.terminate();\n * ```\n */\nexport class OCRProcessor implements Disposable {\n private worker: TesseractWorker | null = null // 使用导入的 TesseractWorker 类型\n private ocrWorker: ReturnType<\n typeof createCustomWorker<\n OCRProcessInput,\n { idCardInfo: IDCardInfo; processingTime: number }\n >\n > | null = null\n private initialized: boolean = false\n private resultCache: LRUCache<string, IDCardInfo>\n private options: OCRProcessorOptions\n\n /**\n * 创建OCR处理器实例\n *\n * @param options OCR处理器选项\n */\n constructor(options: OCRProcessorOptions = {}) {\n this.options = {\n useWorker: isWorkerSupported(),\n enableCache: true,\n cacheSize: 50,\n maxImageDimension: 1000,\n logger: console.log,\n ...options,\n }\n\n // 初始化缓存\n this.resultCache = new LRUCache<string, IDCardInfo>(this.options.cacheSize)\n }\n\n /**\n * 初始化OCR引擎\n *\n * 加载Tesseract OCR引擎和中文简体语言包,并设置适合身份证识别的参数\n *\n * @returns {Promise<void>} 初始化完成的Promise\n */\n async initialize(): Promise<void> {\n if (this.initialized) return\n\n if (this.options.useWorker) {\n // 使用自定义Worker线程处理OCR\n this.ocrWorker = createCustomWorker<\n OCRProcessInput,\n { idCardInfo: IDCardInfo; processingTime: number }\n >(processOCRInWorker as any) // 使用类型断言解决类型不兼容问题\n this.initialized = true\n this.options.logger?.(\"OCR Worker 初始化完成\")\n } else {\n // 使用主线程处理OCR\n this.worker = createWorker({\n logger: this.options.logger,\n })\n\n await this.worker.load()\n await this.worker.loadLanguage(\"chi_sim\")\n await this.worker.initialize(\"chi_sim\")\n await this.worker.setParameters({\n tessedit_char_whitelist:\n \"0123456789X年月日壹贰叁肆伍陆柒捌玖拾民族汉满回维吾尔藏苗彝壮朝鲜侗瑶白土家哈尼哈萨克傣黎傈僳佤高山拉祜水东乡纳西景颇柯尔克孜达斡尔仫佬羌布朗撒拉毛南仡佬锡伯阿昌普米塔吉克怒乌孜别克俄罗斯鄂温克德昂保安裕固京塔塔尔独龙鄂伦春赫哲门巴珞巴基诺男女住址出生公民身份号码签发机关有效期省市区县乡镇街道号楼单元室ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\", // 优化字符白名单,增加常见地址字符,移除部分不常用汉字\n })\n // 增加一些针对性的参数,提高识别率\n await this.worker.setParameters({\n tessedit_pageseg_mode: 7, // PSM_SINGLE_LINE,使用数字而不是字符串\n preserve_interword_spaces: \"1\", // 保留单词间的空格\n })\n\n this.initialized = true\n this.options.logger?.(\"OCR引擎初始化完成\")\n }\n }\n\n /**\n * 处理身份证图像并提取信息\n * @param imageData 要处理的身份证图像数据\n * @returns 提取的身份证信息\n */\n async processIDCard(imageData: ImageData): Promise<IDCardInfo> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n // 计算图像指纹,用于缓存查找\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n\n // 检查缓存中是否有结果\n const cachedResult = this.resultCache.get(fingerprint)\n if (cachedResult) {\n this.options.logger?.(\"使用缓存的OCR结果\")\n return cachedResult\n }\n }\n\n // 调整图像大小以提高性能和准确性\n const downsampledImage = ImageProcessor.resizeImage(\n imageData,\n this.options.maxImageDimension || 1000,\n this.options.maxImageDimension || 1000,\n true // 保持宽高比\n )\n\n // 提高图像质量以获得更好的OCR结果\n const enhancedImage = ImageProcessor.batchProcess(downsampledImage, {\n brightness:\n this.options.brightness !== undefined ? this.options.brightness : 10, // 调整默认亮度\n contrast:\n this.options.contrast !== undefined ? this.options.contrast : 20, // 调整默认对比度\n sharpen: true, // 默认启用锐化,通常对OCR有益\n })\n\n // 转换为base64供Tesseract处理\n // 创建一个canvas元素\n const canvas = document.createElement(\"canvas\")\n canvas.width = enhancedImage.width\n canvas.height = enhancedImage.height\n const ctx = canvas.getContext(\"2d\")\n\n if (!ctx) {\n throw new Error(\"无法创建canvas上下文\")\n }\n\n // 将ImageData绘制到canvas\n ctx.putImageData(enhancedImage, 0, 0)\n\n // 转换为Base64\n const base64Image = canvas.toDataURL(\"image/jpeg\", 0.7)\n\n // OCR识别\n try {\n let idCardInfo: IDCardInfo\n\n if (this.options.useWorker && this.ocrWorker) {\n // 使用Worker线程处理\n const result = await this.ocrWorker.postMessage({\n imageBase64: base64Image,\n // 不传递函数对象,避免DataCloneError\n tessWorkerOptions: {},\n })\n\n idCardInfo = result.idCardInfo\n this.options.logger?.(\n `OCR处理完成,用时: ${result.processingTime.toFixed(2)}ms`\n )\n } else {\n // 使用主线程处理\n const startTime = performance.now()\n\n // 转换ImageData为Canvas\n const canvas = ImageProcessor.imageDataToCanvas(enhancedImage)\n\n // 确保worker已初始化\n if (!this.worker) {\n throw new Error(\"OCR引擎未初始化\");\n }\n\n const { data } = (await this.worker.recognize(canvas)) as {\n data: { text: string }\n }\n\n // 解析身份证信息\n idCardInfo = this.parseIDCardText(data.text)\n\n const processingTime = performance.now() - startTime\n this.options.logger?.(\n `OCR处理完成,用时: ${processingTime.toFixed(2)}ms`\n )\n }\n\n // 缓存结果\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n this.resultCache.set(fingerprint, idCardInfo)\n }\n\n return idCardInfo\n } catch (error) {\n // 改进错误处理\n const errorMessage = error instanceof Error \n ? error.message \n : typeof error === 'object' \n ? JSON.stringify(error) \n : String(error);\n \n this.options.logger?.(`OCR识别错误: ${errorMessage}`);\n \n // 返回空对象,避免完全失败\n return {} as IDCardInfo\n }\n }\n\n /**\n * 解析身份证文本信息\n *\n * 从OCR识别到的文本中提取结构化的身份证信息\n *\n * @private\n * @param {string} text - OCR识别到的文本\n * @returns {IDCardInfo} 提取到的身份证信息对象\n */\n /**\n * 格式化日期字符串为标准格式 (YYYY-MM-DD)\n * @param dateStr 原始日期字符串\n * @returns 格式化后的日期字符串\n */\n private formatDateString(dateStr: string): string {\n // 先尝试提取年月日\n const dateMatch = dateStr.match(\n /(\\d{4})[-\\.\\u5e74\\s]*(\\d{1,2})[-\\.\\u6708\\s]*(\\d{1,2})[日]*/\n )\n if (dateMatch) {\n const year = dateMatch[1]\n const month = dateMatch[2].padStart(2, \"0\")\n const day = dateMatch[3].padStart(2, \"0\")\n return `${year}-${month}-${day}`\n }\n\n // 如果是纯数字格式如 20220101\n if (/^\\d{8}$/.test(dateStr)) {\n const year = dateStr.substring(0, 4)\n const month = dateStr.substring(4, 6)\n const day = dateStr.substring(6, 8)\n return `${year}-${month}-${day}`\n }\n\n // 如果无法格式化,返回原始字符串\n return dateStr\n }\n\n /**\n * 验证身份证号是否符合规则\n * @param idNumber 身份证号\n * @returns 是否有效\n */\n private validateIDNumber(idNumber: string): boolean {\n // 基本验证,校验位有效性和长度\n if (!idNumber || idNumber.length !== 18) {\n return false\n }\n\n // 检查格式,前17位必须为数字,最后一位可以是数字或'X'\n const pattern = /^\\d{17}[\\dX]$/\n if (!pattern.test(idNumber)) {\n return false\n }\n\n // 检查日期部分\n const year = parseInt(idNumber.substr(6, 4))\n const month = parseInt(idNumber.substr(10, 2))\n const day = parseInt(idNumber.substr(12, 2))\n\n if (month < 1 || month > 12 || day < 1 || day > 31) {\n return false\n }\n\n // 更详细的检查可以添加校验位的验证等逻辑...\n\n return true\n }\n\n private parseIDCardText(text: string): IDCardInfo {\n const info: IDCardInfo = {}\n\n // 预处理文本,清除多余空白\n const processedText = text.replace(/\\s+/g, \" \").trim()\n\n // 拆分为行,并过滤空行\n const lines = processedText.split(\"\\n\").filter((line) => line.trim())\n\n // 解析身份证号码 - 多种模式匹配\n // 1. 普通18位身份证号模式\n const idNumberRegex = /(\\d{17}[\\dX])/\n // 2. 带前缀的模式\n const idNumberWithPrefixRegex = /公民身份号码[\\s\\:]*(\\d{17}[\\dX])/\n\n // 尝试所有模式\n let idNumber = null\n const basicMatch = processedText.match(idNumberRegex)\n const prefixMatch = processedText.match(idNumberWithPrefixRegex)\n\n if (prefixMatch && prefixMatch[1]) {\n idNumber = prefixMatch[1] // 首选带前缀的匹配,因为最可靠\n } else if (basicMatch && basicMatch[1]) {\n idNumber = basicMatch[1] // 其次是常规匹配\n }\n\n if (idNumber) {\n info.idNumber = idNumber\n }\n\n // 解析姓名 - 使用多种策略\n // 1. 直接匹配姓名标签近的内容\n const nameWithLabelRegex = /姓名[\\s\\:]*([一-龥]{2,4})/\n const nameMatch = processedText.match(nameWithLabelRegex)\n\n // 2. 分析行文本寻找姓名\n if (nameMatch && nameMatch[1]) {\n info.name = nameMatch[1].trim()\n } else {\n // 备用方案:查找短行且内容全是汉字\n for (const line of lines) {\n if (\n line.length >= 2 &&\n line.length <= 5 &&\n /^[一-龥]+$/.test(line) &&\n !/性别|民族|住址|公民|签发|有效/.test(line)\n ) {\n info.name = line.trim()\n break\n }\n }\n }\n\n // 解析性别和民族 - 多种模式匹配\n // 1. 标准格式匹配\n const genderAndNationalityRegex =\n /性别[\\s\\:]*([男女])[\\s ]*民族[\\s\\:]*([一-龥]+族)/\n const genderNationalityMatch = processedText.match(\n genderAndNationalityRegex\n )\n\n // 2. 只匹配性别\n const genderOnlyRegex = /性别[\\s\\:]*([男女])/\n const genderOnlyMatch = processedText.match(genderOnlyRegex)\n\n // 3. 只匹配民族\n const nationalityOnlyRegex = /民族[\\s\\:]*([一-龥]+族)/\n const nationalityOnlyMatch = processedText.match(nationalityOnlyRegex)\n\n if (genderNationalityMatch) {\n info.gender = genderNationalityMatch[1]\n info.nationality = genderNationalityMatch[2]\n } else {\n // 分开获取\n if (genderOnlyMatch) info.gender = genderOnlyMatch[1]\n if (nationalityOnlyMatch) info.nationality = nationalityOnlyMatch[1]\n }\n\n // 解析出生日期 - 支持多种格式\n // 1. 标准格式:YYYY年MM月DD日\n const birthDateRegex1 = /出生[\\s\\:]*(\\d{4})年(\\d{1,2})月(\\d{1,2})[日号]/\n // 2. 美式日期格式:YYYY-MM-DD或YYYY/MM/DD\n const birthDateRegex2 = /出生[\\s\\:]*(\\d{4})[-\\/\\.](\\d{1,2})[-\\/\\.](\\d{1,2})/\n // 3. 带前缀的格式\n const birthDateRegex3 =\n /出生日期[\\s\\:]*(\\d{4})[-\\/\\.\\u5e74](\\d{1,2})[-\\/\\.\\u6708](\\d{1,2})[日号]?/\n\n let birthDateMatch =\n processedText.match(birthDateRegex1) ||\n processedText.match(birthDateRegex2) ||\n processedText.match(birthDateRegex3)\n\n // 4. 从身份证号码中提取出生日期(如果上述方法失败)\n if (!birthDateMatch && info.idNumber && info.idNumber.length === 18) {\n const year = info.idNumber.substring(6, 10)\n const month = info.idNumber.substring(10, 12)\n const day = info.idNumber.substring(12, 14)\n info.birthDate = `${year}-${month}-${day}`\n } else if (birthDateMatch) {\n // 确保月份和日期是两位数\n const year = birthDateMatch[1]\n const month = birthDateMatch[2].padStart(2, \"0\")\n const day = birthDateMatch[3].padStart(2, \"0\")\n info.birthDate = `${year}-${month}-${day}`\n }\n\n // 解析地址 - 改进的正则匹配\n // 1. 常规模式\n const addressRegex1 = /住址[\\s\\:]*([\\s\\S]*?)(?=公民身份|出生|性别|签发)/\n // 2. 更宽松的模式\n const addressRegex2 = /住址[\\s\\:]*([一-龥a-zA-Z0-9\\s\\.\\-]+)/\n\n const addressMatch =\n processedText.match(addressRegex1) || processedText.match(addressRegex2)\n\n if (addressMatch && addressMatch[1]) {\n // 清理地址中的常见错误和多余空格\n info.address = addressMatch[1]\n .replace(/\\s+/g, \"\")\n .replace(/\\n/g, \"\")\n .trim()\n\n // 限制地址长度并判断地址合理性\n if (info.address.length > 70) {\n info.address = info.address.substring(0, 70)\n }\n\n // 确保地址是合理的(不仅仅包含符号或数字)\n if (!/[一-龥]/.test(info.address)) {\n info.address = \"\" // 如果没有中文字符,可能不是有效地址\n }\n }\n\n // 解析签发机关\n const authorityRegex1 =\n /签发机关[\\s\\:]*([\\s\\S]*?)(?=有效|公民|出生|\\d{8}|$)/\n const authorityRegex2 = /签发机关[\\s\\:]*([一-龥\\s]+)/\n\n const authorityMatch =\n processedText.match(authorityRegex1) ||\n processedText.match(authorityRegex2)\n\n if (authorityMatch && authorityMatch[1]) {\n info.issuingAuthority = authorityMatch[1]\n .replace(/\\s+/g, \"\")\n .replace(/\\n/g, \"\")\n .trim()\n }\n\n // 解析有效期限 - 支持多种格式\n // 1. 常规格式:YYYY.MM.DD-YYYY.MM.DD\n const validPeriodRegex1 =\n /有效期限[\\s\\:]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日\\s]*)[-\\s]*(至|-)[-\\s]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日]*|[永久长期]*)/\n // 2. 简化格式:YYYYMMDD-YYYYMMDD\n const validPeriodRegex2 =\n /有效期限[\\s\\:]*(\\d{8})[-\\s]*(至|-)[-\\s]*(\\d{8}|[永久长期]*)/\n\n const validPeriodMatch =\n processedText.match(validPeriodRegex1) ||\n processedText.match(validPeriodRegex2)\n\n if (validPeriodMatch) {\n // 格式化为统一的有效期限形式\n if (validPeriodMatch[1] && validPeriodMatch[3]) {\n const startDate = this.formatDateString(validPeriodMatch[1])\n const endDate = /\\d/.test(validPeriodMatch[3])\n ? this.formatDateString(validPeriodMatch[3])\n : \"长期有效\"\n\n info.validPeriod = `${startDate}-${endDate}`\n } else {\n info.validPeriod = validPeriodMatch[0].replace(\"有效期限\", \"\").trim()\n }\n }\n\n return info\n }\n\n /**\n * 清除结果缓存\n */\n clearCache(): void {\n this.resultCache.clear()\n this.options.logger?.(\"OCR结果缓存已清除\")\n }\n\n /**\n * 终止OCR引擎并释放资源\n *\n * @returns {Promise<void>} 终止完成的Promise\n */\n async terminate(): Promise<void> {\n if (this.worker) {\n await this.worker.terminate()\n this.worker = null\n }\n\n if (this.ocrWorker) {\n this.ocrWorker.terminate()\n this.ocrWorker = null\n }\n\n this.initialized = false\n this.options.logger?.(\"OCR引擎已终止\")\n }\n\n /**\n * 释放资源\n */\n dispose(): Promise<void> {\n return this.terminate()\n }\n}\n","/**\n * @file 身份证防伪检测模块\n * @description 提供身份证防伪特征识别功能,区分真假身份证\n * @module AntiFakeDetector\n * @version 1.3.2\n */\n\nimport { ImageProcessor } from \"../../utils/image-processing\"\nimport { LRUCache, calculateImageFingerprint } from \"../../utils/performance\"\nimport { Disposable } from \"../../utils/resource-manager\"\n\n/**\n * 防伪检测结果\n */\nexport interface AntiFakeDetectionResult {\n isAuthentic: boolean // 是否为真实身份证\n confidence: number // 置信度(0-1)\n detectedFeatures: string[] // 检测到的防伪特征\n message: string // 结果描述\n processingTime?: number // 处理时间(ms)\n}\n\n/**\n * 防伪检测器配置选项\n */\nexport interface AntiFakeDetectorOptions {\n sensitivity?: number // 敏感度 (0-1),值越高越严格\n enableCache?: boolean // 是否启用缓存\n cacheSize?: number // 缓存大小\n logger?: (message: string) => void // 日志记录器,message 类型设为 string\n}\n\n/**\n * 身份证防伪特征检测器\n *\n * 基于图像分析技术检测身份证中的多种防伪特征,包括:\n * 1. 荧光油墨特征\n * 2. 微缩文字\n * 3. 光变图案\n * 4. 雕刻凹印\n * 5. 隐形图案\n *\n * @example\n * ```typescript\n * // 创建防伪检测器\n * const antiFakeDetector = new AntiFakeDetector({\n * sensitivity: 0.8,\n * enableCache: true\n * });\n *\n * // 分析身份证图像\n * const imageData = await ImageProcessor.createImageDataFromFile(idCardFile);\n * const result = await antiFakeDetector.detect(imageData);\n *\n * if (result.isAuthentic) {\n * console.log('身份证真实,检测到防伪特征:', result.detectedFeatures);\n * } else {\n * console.log('警告!', result.message);\n * }\n * ```\n */\nexport class AntiFakeDetector implements Disposable {\n private options: Required<AntiFakeDetectorOptions>\n private resultCache: LRUCache<string, AntiFakeDetectionResult>\n\n /**\n * 创建身份证防伪检测器实例\n *\n * @param options 防伪检测器配置\n */\n constructor(options: AntiFakeDetectorOptions = {}) {\n this.options = {\n sensitivity: 0.7,\n enableCache: true,\n cacheSize: 50,\n logger: console.log,\n ...options,\n }\n\n // 初始化缓存\n this.resultCache = new LRUCache<string, AntiFakeDetectionResult>(\n this.options.cacheSize\n )\n }\n\n /**\n * 检测身份证图像的防伪特征\n *\n * @param imageData 身份证图像数据\n * @returns 防伪检测结果\n */\n async detect(imageData: ImageData): Promise<AntiFakeDetectionResult> {\n const startTime = performance.now()\n\n // 检查缓存\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n const cachedResult = this.resultCache.get(fingerprint)\n\n if (cachedResult) {\n this.options.logger(\"使用缓存的防伪检测结果\")\n return cachedResult\n }\n }\n\n // 图像预处理增强防伪特征\n const enhancedImage = this.enhanceAntiFakeFeatures(imageData)\n\n // 执行多种防伪特征检测\n const featureResults = await Promise.all([\n this.detectUVInkFeatures(enhancedImage),\n this.detectMicroText(enhancedImage),\n this.detectOpticalVariable(enhancedImage),\n this.detectIntaglioPrinting(enhancedImage),\n this.detectGhostImage(enhancedImage),\n ])\n\n // 汇总检测结果\n const detectedFeatures: string[] = []\n let totalConfidence = 0\n\n for (const [feature, detected, confidence] of featureResults) {\n if (detected && confidence > 0.5) {\n detectedFeatures.push(feature)\n totalConfidence += confidence\n }\n }\n\n // 计算最终结果\n const normalizedConfidence =\n featureResults.length > 0 ? totalConfidence / featureResults.length : 0\n\n // 根据敏感度和检测到的特征决定是否通过验证\n const isAuthentic =\n normalizedConfidence >= this.options.sensitivity &&\n detectedFeatures.length >= 2\n\n // 生成结果消息\n const message = isAuthentic\n ? `身份证真实,检测到${detectedFeatures.length}个防伪特征`\n : detectedFeatures.length > 0\n ? `可疑身份证,仅检测到${detectedFeatures.length}个防伪特征,置信度不足`\n : \"未检测到有效防伪特征,可能为伪造证件\"\n\n const result: AntiFakeDetectionResult = {\n isAuthentic,\n confidence: normalizedConfidence,\n detectedFeatures,\n message,\n processingTime: performance.now() - startTime,\n }\n\n // 缓存结果\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n this.resultCache.set(fingerprint, result)\n }\n\n return result\n }\n\n /**\n * 增强身份证图像中的防伪特征\n *\n * @param imageData 原始图像数据\n * @returns 增强后的图像数据\n * @private\n */\n private enhanceAntiFakeFeatures(imageData: ImageData): ImageData {\n // 应用特定的图像处理增强防伪特征\n return ImageProcessor.batchProcess(imageData, {\n contrast: 30, // 增强对比度\n brightness: 10, // 轻微提高亮度\n sharpen: true, // 锐化图像突出细节\n })\n }\n\n /**\n * 检测荧光油墨特征\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectUVInkFeatures(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 在真实身份证上,荧光油墨会在特定反光条件下呈现特定颜色特征\n // 在普通可见光下,我们分析蓝色和紫外色通道分布特征\n\n // 1. 提取蓝色通道并增强对比度\n const blueChannel = this.extractColorChannel(imageData, \"blue\")\n\n // 2. 分析蓝色通道的分布特征\n const { peaks, variance } = this.analyzeChannelDistribution(blueChannel)\n\n // 3. 分析特定区域的颜色模式\n const patternScore = this.detectUVColorPattern(imageData)\n\n // 4. 计算综合得分\n // 特征分析:荧光油墨在蓝色通道通常有显著峰值,且分布更聚集\n let score = 0\n\n // 过多的峰值表明可能是真实身份证上的荧光特征\n if (peaks > 3 && peaks < 10) {\n score += 0.4\n }\n\n // 方差越大,表示颜色对比度越高,更可能有荧光特征\n if (variance > 1000) {\n score += 0.3\n }\n\n // 颜色模式得分\n score += patternScore * 0.3\n\n // 重要区域分析\n // 身份证头像区域通常不应具有荧光特征\n const hasPortraitAreaFeatures = this.analyzePortraitArea(imageData)\n if (hasPortraitAreaFeatures) {\n // 头像区域不应该有荧光特征,如果有可能是伪造的\n score -= 0.2\n }\n\n // 求出最终分数并限制在[0,1]范围内\n const confidence = Math.max(0, Math.min(1, score))\n const detected = confidence > 0.55\n\n return [\"荧光油墨\", detected, confidence]\n }\n\n /**\n * 从图像数据中提取指定颜色通道\n * @param imageData 原始图像数据\n * @param channel 通道名称(red, green, blue)\n */\n private extractColorChannel(\n imageData: ImageData,\n channel: \"red\" | \"green\" | \"blue\"\n ): Uint8ClampedArray {\n const { data, width, height } = imageData\n const channelOffset = channel === \"red\" ? 0 : channel === \"green\" ? 1 : 2\n const channelData = new Uint8ClampedArray(width * height)\n\n for (let i = 0; i < data.length; i += 4) {\n const pixelIndex = i / 4\n channelData[pixelIndex] = data[i + channelOffset]\n }\n\n return channelData\n }\n\n /**\n * 分析颜色通道分布特征\n * @param channelData 颜色通道数据\n */\n private analyzeChannelDistribution(channelData: Uint8ClampedArray): {\n peaks: number\n variance: number\n } {\n // 计算直方图\n const histogram = new Array(256).fill(0)\n for (let i = 0; i < channelData.length; i++) {\n histogram[channelData[i]]++\n }\n\n // 平滑直方图以减少噪声\n const smoothedHistogram = this.smoothHistogram(histogram, 3)\n\n // 计算峰值数量\n let peaks = 0\n for (let i = 1; i < 255; i++) {\n if (\n smoothedHistogram[i] > smoothedHistogram[i - 1] &&\n smoothedHistogram[i] > smoothedHistogram[i + 1] &&\n smoothedHistogram[i] > channelData.length * 0.01\n ) {\n // 只计算显著峰值\n peaks++\n }\n }\n\n // 计算方差\n let mean = 0\n for (let i = 0; i < channelData.length; i++) {\n mean += channelData[i]\n }\n mean /= channelData.length\n\n let variance = 0\n for (let i = 0; i < channelData.length; i++) {\n variance += Math.pow(channelData[i] - mean, 2)\n }\n variance /= channelData.length\n\n return { peaks, variance }\n }\n\n /**\n * 平滑直方图以减少噪声\n */\n private smoothHistogram(histogram: number[], windowSize: number): number[] {\n const result = new Array(histogram.length).fill(0)\n const halfWindow = Math.floor(windowSize / 2)\n\n for (let i = 0; i < histogram.length; i++) {\n let sum = 0\n let count = 0\n\n for (\n let j = Math.max(0, i - halfWindow);\n j <= Math.min(histogram.length - 1, i + halfWindow);\n j++\n ) {\n sum += histogram[j]\n count++\n }\n\n result[i] = sum / count\n }\n\n return result\n }\n\n /**\n * 检测图像中的荧光颜色模式\n */\n private detectUVColorPattern(imageData: ImageData): number {\n // 分析特定组合颜色的出现频率,荧光油墨在可见光下也有特定的颜色特征\n const { data, width, height } = imageData\n let uvColorCount = 0\n\n // 寻找可能为荧光油墨的特定颜色模式\n // 这些颜色通常是特定的蓝紫色调和高对比度\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i]\n const g = data[i + 1]\n const b = data[i + 2]\n\n // 检查是否是荧光油墨特有的颜色范围\n // 这里使用简化的追踪条件,实际应用中应使用更复杂的颜色模型\n if (b > 1.5 * r && b > 1.3 * g && b > 100) {\n uvColorCount++\n }\n }\n\n // 计算荧光颜色像素占比\n const totalPixels = width * height\n const uvColorRatio = uvColorCount / totalPixels\n\n // 对于真实身份证,荧光颜色的占比应该在一定范围内\n // 如果占比过高或过低,可能是伪造的\n const idealRatio = 0.05 // 理想占比\n const deviation = Math.abs(uvColorRatio - idealRatio) / idealRatio\n\n // 将差异转换为0-1的置信度分数\n return Math.max(0, 1 - Math.min(1, deviation * 2))\n }\n\n /**\n * 分析头像区域是否存在荧光特征\n * 这个方法用于检测伪造的身份证,因为头像区域不应该有荧光特征\n */\n private analyzePortraitArea(imageData: ImageData): boolean {\n // 假设头像区域大约占据图片右上方四分之一的区域\n const { width, height, data } = imageData\n const portraitX = Math.floor(width * 0.6)\n const portraitY = Math.floor(height * 0.2)\n const portraitWidth = Math.floor(width * 0.3)\n const portraitHeight = Math.floor(height * 0.3)\n\n let uvFeatureCount = 0\n let totalPixels = 0\n\n // 检查头像区域的荧光特征\n for (let y = portraitY; y < portraitY + portraitHeight; y++) {\n for (let x = portraitX; x < portraitX + portraitWidth; x++) {\n if (x >= 0 && x < width && y >= 0 && y < height) {\n const i = (y * width + x) * 4\n const r = data[i]\n const g = data[i + 1]\n const b = data[i + 2]\n\n // 使用与上面相同的荧光颜色检测标准\n if (b > 1.5 * r && b > 1.3 * g && b > 100) {\n uvFeatureCount++\n }\n\n totalPixels++\n }\n }\n }\n\n // 如果头像区域的荧光特征占比过高,可能是伪造的\n return totalPixels > 0 && uvFeatureCount / totalPixels > 0.1\n }\n\n /**\n * 检测微缩文字\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectMicroText(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 微缩文字检测 - 身份证上的微缩文字是重要的防伪特征\n // 这些文字很小,但会呈现规则的线条和高频组件\n\n // 1. 转换图像为灰度图\n const grayscale = ImageProcessor.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n )\n\n // 2. 执行边缘检测突出微缩文字\n const edgeData = ImageProcessor.detectEdges(grayscale, 40) // 强化的边缘检测\n\n // 3. 分析频率特征 - 微缩文字呈现高频的边缘过渡\n const frequencyFeatures = this.analyzeFrequencyFeatures(edgeData)\n\n // 4. 检测微缩文字的具体区域\n const microTextRegions = this.detectMicroTextRegions(edgeData)\n\n // 5. 综合分析结果计算置信度\n let score = 0\n\n // 频率特征分数\n score += frequencyFeatures.score * 0.6\n\n // 区域特征分数\n if (microTextRegions.count > 0) {\n // 过多的区域也可能表示噪声,因此有一个最佳范围\n const normalizedCount = Math.min(microTextRegions.count, 5) / 5\n score += normalizedCount * 0.4\n }\n\n // 对置信度进行最终调整\n const confidence = Math.max(0, Math.min(1, score))\n const detected = confidence > 0.5\n\n return [\"微缩文字\", detected, confidence]\n }\n\n /**\n * 分析边缘图像的频率特征\n * 微缩文字呈现高频的边缘过渡\n */\n private analyzeFrequencyFeatures(edgeData: ImageData): {\n score: number\n highFreqRatio: number\n } {\n const { data, width, height } = edgeData\n let edgeCount = 0\n const totalPixels = width * height\n\n // 计算边缘像素的数量\n for (let i = 0; i < data.length; i += 4) {\n if (data[i] > 200) {\n // 大于阈值的边缘像素\n edgeCount++\n }\n }\n\n // 计算高频边缘分布\n // 统计边缘过渡的变化频率\n let highFreqTransitions = 0\n\n // 检测行方向的边缘变化\n for (let y = 0; y < height; y++) {\n let prevEdge = false\n let transitions = 0\n\n for (let x = 0; x < width; x++) {\n const i = (y * width + x) * 4\n const isEdge = data[i] > 200\n\n if (isEdge !== prevEdge) {\n transitions++\n prevEdge = isEdge\n }\n }\n\n // 每行的过渡频率\n if (transitions > width * 0.1) {\n // 高频过渡行\n highFreqTransitions++\n }\n }\n\n // 计算列方向的边缘变化\n let colHighFreqTransitions = 0\n for (let x = 0; x < width; x++) {\n let prevEdge = false\n let transitions = 0\n\n for (let y = 0; y < height; y++) {\n const i = (y * width + x) * 4\n const isEdge = data[i] > 200\n\n if (isEdge !== prevEdge) {\n transitions++\n prevEdge = isEdge\n }\n }\n\n // 每列的过渡频率\n if (transitions > height * 0.1) {\n // 高频过渡列\n colHighFreqTransitions++\n }\n }\n\n // 综合计算高频特征比例\n const rowHighFreqRatio = highFreqTransitions / height\n const colHighFreqRatio = colHighFreqTransitions / width\n const highFreqRatio = (rowHighFreqRatio + colHighFreqRatio) / 2\n\n // 计算最终分数\n // 真实的微缩文字应该有适度的高频特征,而不是极端的高或低\n const idealRatio = 0.15 // 理想的高频比例\n const deviationFactor = Math.abs(highFreqRatio - idealRatio) / idealRatio\n const score = Math.max(0, 1 - Math.min(1, deviationFactor * 3))\n\n return { score, highFreqRatio }\n }\n\n /**\n * 检测微缩文字区域\n * 微缩文字通常呈现呈现规则的组合排列\n */\n private detectMicroTextRegions(edgeData: ImageData): {\n count: number\n regions: Array<{ x: number; y: number; w: number; h: number }>\n } {\n const { data, width, height } = edgeData\n const visitedMap = new Array(width * height).fill(false)\n const regions: Array<{ x: number; y: number; w: number; h: number }> = []\n\n // 使用满足条件的连通区域寻找微缩文字区域\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = y * width + x\n const i = idx * 4\n\n // 如果是边缘像素且未访问过\n if (data[i] > 200 && !visitedMap[idx]) {\n // 使用深度优先搜索找到连通的边缘区域\n const regionPoints = this.floodFillEdge(edgeData, x, y, visitedMap)\n\n // 分析区域\n if (regionPoints.length > 10) {\n // 小区域忽略\n const [minX, minY, maxX, maxY] = this.getBoundingBox(regionPoints)\n const regionWidth = maxX - minX + 1\n const regionHeight = maxY - minY + 1\n\n // 检查区域大小和纹理特征\n if (\n regionWidth > 5 &&\n regionHeight > 5 &&\n regionWidth < width * 0.2 &&\n regionHeight < height * 0.2\n ) {\n // 计算区域密度\n const density = regionPoints.length / (regionWidth * regionHeight)\n\n // 检查并添加符合微缩文字特征的区域\n if (density > 0.1 && density < 0.5) {\n // 合适的密度范围\n regions.push({\n x: minX,\n y: minY,\n w: regionWidth,\n h: regionHeight,\n })\n }\n }\n }\n }\n }\n }\n\n return { count: regions.length, regions }\n }\n\n /**\n * 深度优先搜索连通的边缘区域\n */\n private floodFillEdge(\n edgeData: ImageData,\n startX: number,\n startY: number,\n visitedMap: boolean[]\n ): Array<{ x: number; y: number }> {\n const { data, width, height } = edgeData\n const stack: Array<{ x: number; y: number }> = []\n const points: Array<{ x: number; y: number }> = []\n const dx = [-1, 0, 1, -1, 1, -1, 0, 1]\n const dy = [-1, -1, -1, 0, 0, 1, 1, 1]\n\n // 起始点\n stack.push({ x: startX, y: startY })\n visitedMap[startY * width + startX] = true\n\n while (stack.length > 0) {\n const { x, y } = stack.pop()!\n points.push({ x, y })\n\n // 检查88个相邻方向\n for (let i = 0; i < 8; i++) {\n const nx = x + dx[i]\n const ny = y + dy[i]\n\n if (nx >= 0 && nx < width && ny >= 0 && ny < height) {\n const nidx = ny * width + nx\n const ni = nidx * 4\n\n if (data[ni] > 200 && !visitedMap[nidx]) {\n stack.push({ x: nx, y: ny })\n visitedMap[nidx] = true\n }\n }\n }\n }\n\n return points\n }\n\n /**\n * 获取点集的外接矩形\n */\n private getBoundingBox(\n points: Array<{ x: number; y: number }>\n ): [number, number, number, number] {\n let minX = Number.MAX_SAFE_INTEGER\n let minY = Number.MAX_SAFE_INTEGER\n let maxX = 0\n let maxY = 0\n\n for (const { x, y } of points) {\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x)\n maxY = Math.max(maxY, y)\n }\n\n return [minX, minY, maxX, maxY]\n }\n\n /**\n * 检测光变图案\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectOpticalVariable(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 提取特定区域并分析颜色变化\n // 在实际实现中需要定位光变图案区域并分析其特征\n // 这里使用模拟实现\n\n // 模拟检测: 65%的概率检测到,置信度0.6-0.9\n const detected = Math.random() > 0.35\n const confidence = detected ? 0.6 + Math.random() * 0.3 : 0\n\n return [\"光变图案\", detected, confidence]\n }\n\n /**\n * 检测凹印雕刻特征\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectIntaglioPrinting(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 使用特定滤镜增强凹印效果\n // 在实际实现中应分析阴影和纹理模式\n // 这里使用模拟实现\n\n // 模拟检测: 75%的概率检测到,置信度0.65-0.9\n const detected = Math.random() > 0.25\n const confidence = detected ? 0.65 + Math.random() * 0.25 : 0\n\n return [\"雕刻凹印\", detected, confidence]\n }\n\n /**\n * 检测隐形图案(幽灵图像)\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectGhostImage(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 调整对比度和亮度显现隐形图案\n // 在实际实现中应使用特定滤镜和图像处理算法\n // 这里使用模拟实现\n\n // 模拟检测: 60%的概率检测到,置信度0.55-0.85\n const detected = Math.random() > 0.4\n const confidence = detected ? 0.55 + Math.random() * 0.3 : 0\n\n return [\"隐形图案\", detected, confidence]\n }\n\n /**\n * 清除结果缓存\n */\n clearCache(): void {\n this.resultCache.clear()\n this.options.logger(\"防伪检测结果缓存已清除\")\n }\n\n /**\n * 释放资源\n */\n dispose(): void {\n this.resultCache.clear()\n }\n}\n","/**\n * @file 身份证模块入口\n * @description 提供身份证识别和验证功能的模块入口\n * @module modules/id-card\n */\n\nimport { BaseModule } from '../../core/base-module';\nimport { IDCardDetector } from './id-card-detector';\nimport { OCRProcessor } from './ocr-processor';\nimport { AntiFakeDetector } from './anti-fake-detector';\nimport { IDCardInfo, IDCardType, IDCardModuleOptions, IDCardVerificationResult } from './types';\n\n/**\n * 身份证识别模块\n * 提供身份证检测、OCR识别、防伪检测等功能\n */\nexport class IDCardModule extends BaseModule {\n /** 模块名称 */\n public readonly name: string = 'id-card';\n \n /** 模块配置 */\n private options: IDCardModuleOptions;\n \n /** 身份证检测器 */\n private detector: IDCardDetector;\n \n /** OCR处理器 */\n private ocrProcessor?: OCRProcessor;\n \n /** 防伪检测器 */\n private antiFakeDetector?: AntiFakeDetector;\n \n /** 最后一次检测结果 */\n private lastDetectionResult?: IDCardInfo;\n \n /**\n * 构造函数\n * @param options 模块配置选项\n */\n constructor(options: IDCardModuleOptions = {}) {\n super();\n \n this.options = {\n enabled: true,\n detector: {\n minConfidence: 0.7,\n enableOCR: true,\n enableAntiFake: false,\n ...options.detector\n },\n ocr: {\n useWorker: true,\n maxImageDimension: 1000,\n brightness: 10,\n contrast: 20,\n ...options.ocr\n },\n antiFake: {\n sensitivity: 0.8,\n minConfidence: 0.7,\n ...options.antiFake\n },\n ...options\n };\n \n // 创建检测器\n this.detector = new IDCardDetector({\n minConfidence: this.options.detector?.minConfidence,\n enableEdgeDetection: true,\n returnImage: true\n });\n }\n \n /**\n * 初始化模块\n */\n public async initialize(): Promise<void> {\n if (this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '初始化身份证模块');\n \n try {\n // 初始化检测器\n await this.detector.initialize();\n \n // 如果启用OCR,初始化OCR处理器\n if (this.options.detector?.enableOCR) {\n this.ocrProcessor = new OCRProcessor({\n useWorker: this.options.ocr?.useWorker,\n maxImageDimension: this.options.ocr?.maxImageDimension,\n brightness: this.options.ocr?.brightness,\n contrast: this.options.ocr?.contrast\n });\n \n await this.ocrProcessor.initialize();\n }\n \n // 如果启用防伪检测,初始化防伪检测器\n if (this.options.detector?.enableAntiFake) {\n this.antiFakeDetector = new AntiFakeDetector({\n sensitivity: this.options.antiFake?.sensitivity\n });\n \n // AntiFakeDetector 不需要初始化\n }\n \n this._isInitialized = true;\n this.emit('initialized');\n this.logger.debug(this.name, '身份证模块初始化完成');\n } catch (error) {\n this.logger.error(this.name, '身份证模块初始化失败', error instanceof Error ? error : new Error(String(error)));\n throw new Error(`身份证模块初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 识别身份证图像\n * @param image 图像源\n * @returns 识别结果\n */\n public async recognize(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<IDCardInfo> {\n this.ensureInitialized();\n \n try {\n // 检测身份证\n const detectionResult = await this.detector.processImage(image);\n \n if (!detectionResult.isSuccess() || !detectionResult.data) {\n throw new Error('未检测到身份证');\n }\n \n // 创建结果对象\n const idCardInfo: IDCardInfo = {\n type: detectionResult.data.type || IDCardType.FRONT,\n confidence: detectionResult.data.confidence\n };\n \n // 如果启用OCR且OCR处理器已初始化\n if (this.options.detector?.enableOCR && this.ocrProcessor) {\n // 裁剪并处理图像\n const processedImage = detectionResult.data.image || this.convertToImageData(image);\n \n // 识别文本信息\n const ocrResult = await this.ocrProcessor.processIDCard(processedImage);\n \n // 合并OCR结果\n Object.assign(idCardInfo, ocrResult);\n }\n \n // 如果启用防伪检测且防伪检测器已初始化\n if (this.options.detector?.enableAntiFake && this.antiFakeDetector) {\n const processedImage = this.convertToImageData(image);\n const antiFakeResult = await this.antiFakeDetector.detect(processedImage);\n \n // 转换防伪检测结果格式\n idCardInfo.antiFake = {\n passed: antiFakeResult.isAuthentic,\n score: antiFakeResult.confidence,\n features: {\n // 转换检测到的特征\n fluorescent: antiFakeResult.detectedFeatures.includes('荧光油墨特征'),\n microtext: antiFakeResult.detectedFeatures.includes('微缩文字'),\n opticalVariable: antiFakeResult.detectedFeatures.includes('光变图案'),\n texture: antiFakeResult.detectedFeatures.includes('雕刻凹印'),\n watermark: antiFakeResult.detectedFeatures.includes('隐形图案')\n }\n };\n }\n \n // 保存最后一次检测结果\n this.lastDetectionResult = idCardInfo;\n \n // 触发事件\n this.emit('recognized', { idCardInfo });\n \n return idCardInfo;\n } catch (error) {\n this.logger.error(this.name, '身份证识别失败', error instanceof Error ? error : new Error(String(error)));\n throw new Error(`身份证识别失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 验证身份证信息\n * @param idCardInfo 身份证信息\n * @returns 验证结果\n */\n public verify(idCardInfo: IDCardInfo): IDCardVerificationResult {\n this.ensureInitialized();\n \n const result: IDCardVerificationResult = {\n isValid: true,\n score: 1.0,\n details: {\n idNumberValid: true,\n issueDateValid: true,\n isExpired: false,\n antiFakePassed: true\n }\n };\n \n // 验证身份证号码\n if (idCardInfo.idNumber) {\n result.details!.idNumberValid = this.validateIDNumber(idCardInfo.idNumber);\n if (!result.details!.idNumberValid) {\n result.isValid = false;\n result.score -= 0.3;\n result.failureReason = '身份证号码无效';\n }\n }\n \n // 验证有效期\n if (idCardInfo.validTo) {\n result.details!.isExpired = this.isIDCardExpired(idCardInfo.validTo);\n if (result.details!.isExpired) {\n result.isValid = false;\n result.score -= 0.2;\n result.failureReason = '身份证已过期';\n }\n }\n \n // 验证防伪结果\n if (idCardInfo.antiFake) {\n result.details!.antiFakePassed = idCardInfo.antiFake.passed;\n if (!result.details!.antiFakePassed) {\n result.isValid = false;\n result.score -= 0.5;\n result.failureReason = '防伪检测未通过';\n }\n }\n \n return result;\n }\n \n /**\n * 获取最后一次识别结果\n */\n public getLastRecognitionResult(): IDCardInfo | undefined {\n return this.lastDetectionResult;\n }\n \n /**\n * 释放模块资源\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放身份证模块资源');\n \n try {\n // 释放检测器资源\n await this.detector.dispose();\n \n // 释放OCR处理器资源\n if (this.ocrProcessor) {\n await this.ocrProcessor.terminate();\n }\n \n // 释放防伪检测器资源\n if (this.antiFakeDetector) {\n await this.antiFakeDetector.dispose();\n }\n \n // 调用基类的dispose方法\n await super.dispose();\n } catch (error) {\n this.logger.error(this.name, '身份证模块资源释放失败', error instanceof Error ? error : new Error(String(error)));\n throw new Error(`身份证模块资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 验证身份证号码是否有效\n * @param idNumber 身份证号码\n * @returns 是否有效\n */\n private validateIDNumber(idNumber: string): boolean {\n // 基本格式验证\n if (!idNumber || !/^\\d{17}[\\dX]$/.test(idNumber)) {\n return false;\n }\n \n // 验证出生日期\n const year = parseInt(idNumber.substring(6, 10));\n const month = parseInt(idNumber.substring(10, 12));\n const day = parseInt(idNumber.substring(12, 14));\n \n if (year < 1900 || year > new Date().getFullYear() ||\n month < 1 || month > 12 ||\n day < 1 || day > 31) {\n return false;\n }\n \n // 验证校验位\n const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const validationCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n \n let sum = 0;\n for (let i = 0; i < 17; i++) {\n sum += parseInt(idNumber[i]) * weights[i];\n }\n \n const validationCode = validationCodes[sum % 11];\n return validationCode === idNumber[17].toUpperCase();\n }\n \n /**\n * 检查身份证是否过期\n * @param validTo 有效期截止日期\n * @returns 是否过期\n */\n private isIDCardExpired(validTo: string): boolean {\n // 如果是\"长期\",则视为未过期\n if (validTo === '长期' || validTo === '长期有效') {\n return false;\n }\n \n try {\n // 解析日期字符串\n const parts = validTo.split('-');\n if (parts.length !== 3) {\n return true; // 格式错误,视为过期\n }\n \n const year = parseInt(parts[0]);\n const month = parseInt(parts[1]) - 1; // 月份从0开始\n const day = parseInt(parts[2]);\n \n const expiryDate = new Date(year, month, day);\n const today = new Date();\n \n // 设置时间为当天结束\n today.setHours(0, 0, 0, 0);\n \n return expiryDate < today;\n } catch {\n return true; // 解析错误,视为过期\n }\n }\n \n /**\n * 检测身份证\n * @param image 图像源\n * @returns 检测结果\n */\n public async detect(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<{ \n success: boolean; \n type?: IDCardType; \n confidence: number;\n croppedImage?: ImageData;\n }> {\n this.ensureInitialized();\n \n try {\n // 调用检测器处理图像\n const result = await this.detector.processImage(image);\n \n if (!result.isSuccess() || !result.data) {\n return { success: false, confidence: 0 };\n }\n \n return { \n success: true, \n type: result.data.type, \n confidence: result.data.confidence || 0,\n croppedImage: result.data.image\n };\n } catch (error) {\n this.logger.error(this.name, '身份证检测失败', error instanceof Error ? error : new Error(String(error)));\n return { success: false, confidence: 0 };\n }\n }\n\n /**\n * 将图像转换为 ImageData\n * @param image 图像源\n * @returns ImageData 对象\n */\n private convertToImageData(image: ImageData | HTMLImageElement | HTMLCanvasElement): ImageData {\n // 如果已经是 ImageData,直接返回\n if (image instanceof ImageData) {\n return image;\n }\n\n // 创建 Canvas 用于转换\n const canvas = document.createElement('canvas');\n const width = image instanceof HTMLImageElement ? image.naturalWidth : image.width;\n const height = image instanceof HTMLImageElement ? image.naturalHeight : image.height;\n \n canvas.width = width;\n canvas.height = height;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('无法创建 Canvas 上下文');\n }\n \n // 绘制图像到 Canvas\n ctx.drawImage(image, 0, 0);\n \n // 返回 ImageData\n return ctx.getImageData(0, 0, width, height);\n }\n\n /**\n * 确保模块已初始化\n * @protected\n */\n protected ensureInitialized(): void {\n if (!this._isInitialized) {\n throw new Error('身份证模块尚未初始化');\n }\n }\n}\n\n// 导出类型\nexport * from './types'; ","/**\n * @file 二维码模块类型定义\n * @description 二维码模块相关的类型和接口定义\n * @module modules/qrcode/types\n */\n\n/**\n * 支持的条码格式\n */\nexport enum BarcodeFormat {\n /** QR码 */\n QR_CODE = 'qrcode',\n /** Code 128 */\n CODE_128 = 'code_128',\n /** Code 39 */\n CODE_39 = 'code_39',\n /** Code 93 */\n CODE_93 = 'code_93',\n /** EAN-13 */\n EAN_13 = 'ean_13',\n /** EAN-8 */\n EAN_8 = 'ean_8',\n /** UPC-A */\n UPC_A = 'upc_a',\n /** UPC-E */\n UPC_E = 'upc_e',\n /** ITF */\n ITF = 'itf',\n /** PDF417 */\n PDF_417 = 'pdf_417',\n /** DataMatrix */\n DATA_MATRIX = 'data_matrix',\n /** Aztec */\n AZTEC = 'aztec',\n /** Codabar */\n CODABAR = 'codabar',\n /** Industrial 2 of 5 */\n INDUSTRIAL_2_OF_5 = 'industrial_2_of_5',\n /** QR Code Micro */\n QR_CODE_MICRO = 'qr_code_micro'\n}\n\n/**\n * 默认支持的格式\n */\nexport const DEFAULT_FORMATS = [\n BarcodeFormat.QR_CODE,\n BarcodeFormat.CODE_128,\n BarcodeFormat.CODE_39,\n BarcodeFormat.EAN_13\n];\n\n/**\n * 二维码/条码检测结果\n */\nexport interface QRCodeResult {\n /** 条码内容 */\n data: string;\n \n /** 条码格式 */\n barcodeFormat: BarcodeFormat;\n \n /** 条码类型 (兼容旧版) */\n type?: string;\n \n /** 条码边界框 */\n boundingBox: {\n topLeft: { x: number; y: number };\n topRight: { x: number; y: number };\n bottomRight: { x: number; y: number };\n bottomLeft: { x: number; y: number };\n };\n \n /** 条码中心点 */\n center: { x: number; y: number };\n \n /** 原始图像 */\n image?: ImageData;\n \n /** 置信度 */\n confidence?: number;\n \n /** 原始数据 (解码后的字节) */\n rawBytes?: Uint8Array;\n \n /** 错误校正级别 (QR码) */\n errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';\n}\n\n/**\n * 二维码模块选项\n */\nexport interface QRCodeModuleOptions {\n /** 是否启用模块 */\n enabled?: boolean;\n \n /** 扫描配置 */\n scanner?: {\n /** 最小置信度 */\n minConfidence?: number;\n \n /** 是否尝试多次扫描 */\n tryMultipleScan?: boolean;\n \n /** 是否返回原始图像 */\n returnImage?: boolean;\n \n /** 扫描频率 (ms) */\n scanFrequency?: number;\n \n /** 启用扫描的格式 */\n formats?: BarcodeFormat[];\n };\n \n /** 图像处理配置 */\n imageProcess?: {\n /** 是否进行预处理 */\n preprocess?: boolean;\n \n /** 是否增强对比度 */\n enhanceContrast?: boolean;\n \n /** 二值化阈值 */\n threshold?: number;\n \n /** 是否进行降噪 */\n denoise?: boolean;\n };\n}\n\n/**\n * 实时扫描选项\n */\nexport interface RealtimeScanOptions {\n /** 视频元素 */\n video: HTMLVideoElement;\n \n /** 扫描回调 */\n onResult: (result: QRCodeResult) => void;\n \n /** 错误回调 */\n onError?: (error: Error) => void;\n \n /** 扫描频率 (ms) */\n frequency?: number;\n \n /** 是否连续扫描 */\n continuous?: boolean;\n}\n\n/**\n * 扫描统计信息\n */\nexport interface ScanStats {\n /** 总扫描次数 */\n totalScans: number;\n \n /** 成功次数 */\n successfulScans: number;\n \n /** 失败次数 */\n failedScans: number;\n \n /** 平均处理时间 (ms) */\n avgProcessingTime: number;\n \n /** 成功率 */\n successRate: number;\n}\n","/**\n * @file 二维码扫描器\n * @description 提供二维码检测和解析功能\n * @module modules/qrcode/qr-code-scanner\n */\n\nimport { EventEmitter } from '../../core/event-emitter';\nimport { Logger } from '../../core/logger';\nimport { QRCodeResult, BarcodeFormat } from './types';\nimport jsQR from 'jsqr';\n\n/**\n * 二维码扫描器配置选项\n */\nexport interface QRCodeScannerOptions {\n /** 最小置信度 */\n minConfidence?: number;\n /** 是否返回原始图像 */\n returnImage?: boolean;\n /** 图像处理配置 */\n imageProcess?: {\n /** 是否进行预处理 */\n preprocess?: boolean;\n /** 是否增强对比度 */\n enhanceContrast?: boolean;\n /** 二值化阈值 */\n threshold?: number;\n };\n}\n\n/**\n * 二维码扫描器类\n */\nexport class QRCodeScanner extends EventEmitter {\n private options: QRCodeScannerOptions;\n private logger: Logger;\n private initialized: boolean = false;\n\n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(options: QRCodeScannerOptions = {}) {\n super();\n this.options = {\n minConfidence: 0.6,\n returnImage: false,\n imageProcess: {\n preprocess: true,\n enhanceContrast: true,\n threshold: 128,\n ...options.imageProcess\n },\n ...options\n };\n this.logger = Logger.getInstance();\n }\n\n /**\n * 初始化扫描器\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.logger.debug('QRCodeScanner', '初始化二维码扫描器');\n \n // 验证jsQR是否可用\n if (typeof jsQR !== 'function') {\n throw new Error('jsQR库未加载,请确保已安装jsqr依赖');\n }\n\n this.initialized = true;\n this.logger.debug('QRCodeScanner', '二维码扫描器初始化完成');\n }\n\n /**\n * 扫描图像中的二维码\n * @param image 图像源\n * @returns 二维码扫描结果\n */\n public async scan(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<QRCodeResult | undefined> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n // 将输入转换为ImageData\n const imageData = this.getImageData(image);\n \n // 图像预处理\n const processedImage = this.options.imageProcess?.preprocess\n ? this.preprocessImage(imageData)\n : imageData;\n\n // 使用jsQR进行扫描\n const code = jsQR(\n processedImage.data,\n processedImage.width,\n processedImage.height,\n {\n inversionAttempts: 'dontInvert'\n }\n );\n\n if (!code) {\n return undefined;\n }\n\n // 构建结果\n const result: QRCodeResult = {\n data: code.data,\n barcodeFormat: BarcodeFormat.QR_CODE,\n boundingBox: {\n topLeft: code.location.topLeftCorner,\n topRight: code.location.topRightCorner,\n bottomRight: code.location.bottomRightCorner,\n bottomLeft: code.location.bottomLeftCorner\n },\n center: {\n x: Math.round((code.location.topLeftCorner.x + code.location.bottomRightCorner.x) / 2),\n y: Math.round((code.location.topLeftCorner.y + code.location.bottomRightCorner.y) / 2)\n },\n confidence: 1.0 // jsQR不提供置信度,默认为1.0\n };\n\n // 如果需要返回原始图像\n if (this.options.returnImage) {\n result.image = imageData;\n }\n\n this.logger.debug('QRCodeScanner', `扫描到二维码: ${result.data.substring(0, 20)}${result.data.length > 20 ? '...' : ''}`);\n \n return result;\n }\n\n /**\n * 将各种图像源转换为ImageData\n * @param image 图像源\n * @returns ImageData\n */\n private getImageData(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): ImageData {\n // 如果已经是ImageData,直接返回\n if (image instanceof ImageData) {\n return image;\n }\n\n // 创建canvas并获取2D上下文\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('无法创建Canvas上下文');\n }\n\n // 设置canvas尺寸\n canvas.width = image.width;\n canvas.height = image.height;\n\n // 绘制图像\n ctx.drawImage(image, 0, 0);\n\n // 获取ImageData\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n /**\n * 图像预处理\n * @param imageData 原始图像数据\n * @returns 处理后的图像数据\n */\n private preprocessImage(imageData: ImageData): ImageData {\n // 创建canvas并获取2D上下文\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return imageData;\n }\n\n // 设置canvas尺寸\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n\n // 绘制原始图像\n ctx.putImageData(imageData, 0, 0);\n\n // 增强对比度\n if (this.options.imageProcess?.enhanceContrast) {\n ctx.filter = 'contrast(150%)';\n ctx.drawImage(canvas, 0, 0);\n ctx.filter = 'none';\n }\n\n // 应用二值化\n const threshold = this.options.imageProcess?.threshold || 128;\n const processedData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const data = processedData.data;\n\n for (let i = 0; i < data.length; i += 4) {\n // 计算灰度值\n const gray = 0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2];\n // 二值化\n const value = gray < threshold ? 0 : 255;\n data[i] = data[i + 1] = data[i + 2] = value;\n }\n\n return processedData;\n }\n\n /**\n * 释放资源\n */\n public async dispose(): Promise<void> {\n if (!this.initialized) {\n return;\n }\n\n this.logger.debug('QRCodeScanner', '释放二维码扫描器资源');\n \n // 移除所有事件监听器\n this.removeAllListeners();\n \n this.initialized = false;\n this.logger.debug('QRCodeScanner', '二维码扫描器资源已释放');\n }\n} ","/**\n * @file 二维码模块入口\n * @description 提供二维码识别和解析功能的模块入口\n * @module modules/qrcode\n */\n\nimport { BaseModule } from '../../core/base-module';\nimport { QRCodeResult, QRCodeModuleOptions } from './types';\nimport { QRCodeScanner } from './qr-code-scanner';\n\n/**\n * 二维码模块\n * 提供二维码检测和解析功能\n */\nexport class QRCodeModule extends BaseModule {\n /** 模块名称 */\n public readonly name: string = 'qrcode';\n \n /** 模块配置 */\n private options: QRCodeModuleOptions;\n \n /** 二维码扫描器 */\n private scanner: QRCodeScanner;\n \n /** 最后一次扫描结果 */\n private lastScanResult?: QRCodeResult;\n \n /**\n * 构造函数\n * @param options 模块配置选项\n */\n constructor(options: QRCodeModuleOptions = {}) {\n super();\n \n this.options = {\n enabled: true,\n scanner: {\n minConfidence: 0.6,\n tryMultipleScan: true,\n returnImage: false,\n ...options.scanner\n },\n imageProcess: {\n preprocess: true,\n enhanceContrast: true,\n threshold: 128,\n ...options.imageProcess\n },\n ...options\n };\n \n // 创建扫描器\n this.scanner = new QRCodeScanner({\n minConfidence: this.options.scanner?.minConfidence,\n returnImage: this.options.scanner?.returnImage,\n imageProcess: this.options.imageProcess\n });\n }\n \n /**\n * 初始化模块\n */\n public async initialize(): Promise<void> {\n if (this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '初始化二维码模块');\n \n try {\n // 初始化扫描器\n await this.scanner.initialize();\n \n this._isInitialized = true;\n this.emit('initialized');\n this.logger.debug(this.name, '二维码模块初始化完成');\n } catch (error) {\n this.logger.error(this.name, '二维码模块初始化失败', error as Error);\n throw new Error(`二维码模块初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 扫描图像中的二维码\n * @param image 图像源\n * @returns 二维码扫描结果\n */\n public async scan(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<QRCodeResult | undefined> {\n this.ensureInitialized();\n \n try {\n // 扫描二维码\n const scanResult = await this.scanner.scan(image);\n \n if (scanResult) {\n // 保存最后一次扫描结果\n this.lastScanResult = scanResult;\n \n // 触发事件\n this.emit('qrcode:scanned', { result: scanResult });\n }\n \n return scanResult;\n } catch (error) {\n this.logger.error(this.name, '二维码扫描失败', error as Error);\n throw new Error(`二维码扫描失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 获取最后一次扫描结果\n */\n public getLastScanResult(): QRCodeResult | undefined {\n return this.lastScanResult;\n }\n \n /**\n * 解析二维码数据\n * @param data 二维码数据\n * @returns 解析后的数据对象\n */\n public parseQRCodeData(data: string): Record<string, any> | string {\n try {\n // 尝试解析为JSON\n return JSON.parse(data);\n } catch {\n // 不是JSON,尝试解析为URL参数\n if (data.includes('=')) {\n try {\n const params: Record<string, string> = {};\n const urlParams = new URLSearchParams(data.includes('?') ? data.split('?')[1] : data);\n \n urlParams.forEach((value, key) => {\n params[key] = value;\n });\n \n return params;\n } catch {\n // 解析URL参数失败,返回原始字符串\n return data;\n }\n }\n \n // 返回原始字符串\n return data;\n }\n }\n \n /**\n * 释放模块资源\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放二维码模块资源');\n \n try {\n // 释放扫描器资源\n await this.scanner.dispose();\n \n // 调用基类的dispose方法\n await super.dispose();\n } catch (error) {\n this.logger.error(this.name, '二维码模块资源释放失败', error as Error);\n throw new Error(`二维码模块资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// 导出类型\nexport * from './types'; ","/**\n * @file 人脸模块入口\n * @description 提供人脸检测、活体检测和人脸比对功能的模块入口\n * @module modules/face\n */\n\nimport { BaseModule } from '../../core/base-module';\nimport { FaceDetectionResult, FaceComparisonResult, FaceModuleOptions } from './types';\n\n/**\n * 人脸模块\n * 提供人脸检测、活体检测和人脸比对功能\n */\nexport class FaceModule extends BaseModule {\n /** 模块名称 */\n public readonly name: string = 'face';\n \n /** 模块配置 */\n private options: FaceModuleOptions;\n \n /** 最后一次检测结果 */\n private lastDetectionResult?: FaceDetectionResult;\n \n /**\n * 构造函数\n * @param options 模块配置选项\n */\n constructor(options: FaceModuleOptions = {}) {\n super();\n \n this.options = {\n enabled: true,\n detector: {\n minConfidence: 0.7,\n detectLandmarks: true,\n detectAttributes: true,\n returnFaceImage: false,\n ...options.detector\n },\n liveness: {\n enabled: false,\n type: 'passive',\n minConfidence: 0.8,\n timeout: 10000,\n ...options.liveness\n },\n comparison: {\n minSimilarity: 0.8,\n ...options.comparison\n },\n ...options\n };\n }\n \n /**\n * 初始化模块\n */\n public async initialize(): Promise<void> {\n if (this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '初始化人脸模块');\n \n try {\n // 在此处初始化人脸检测、活体检测和人脸比对所需的模型\n // 这里只是示例,实际实现需要根据具体的人脸识别库来实现\n \n this._isInitialized = true;\n this.emit('initialized');\n this.logger.debug(this.name, '人脸模块初始化完成');\n } catch (error) {\n this.logger.error(this.name, '人脸模块初始化失败', error as Error);\n throw new Error(`人脸模块初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 检测图像中的人脸\n * @param image 图像源\n * @returns 人脸检测结果\n */\n public async detectFace(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<FaceDetectionResult | undefined> {\n this.ensureInitialized();\n \n try {\n // 在此处实现人脸检测逻辑\n // 这里只是示例,实际实现需要根据具体的人脸识别库来实现\n const faceDetectionResult: FaceDetectionResult = {\n boundingBox: {\n x: 0,\n y: 0,\n width: 100,\n height: 100\n },\n confidence: 0.9\n };\n \n // 保存最后一次检测结果\n this.lastDetectionResult = faceDetectionResult;\n \n // 触发事件\n this.emit('face:detected', { result: faceDetectionResult });\n \n return faceDetectionResult;\n } catch (error) {\n this.logger.error(this.name, '人脸检测失败', error as Error);\n throw new Error(`人脸检测失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 进行活体检测\n * @param image 图像源\n * @returns 活体检测结果\n */\n public async detectLiveness(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<boolean> {\n this.ensureInitialized();\n \n if (!this.options.liveness?.enabled) {\n throw new Error('活体检测未启用');\n }\n \n try {\n // 在此处实现活体检测逻辑\n // 这里只是示例,实际实现需要根据具体的活体检测算法来实现\n const livenessResult = true;\n \n // 触发事件\n this.emit('face:liveness', { passed: livenessResult });\n \n return livenessResult;\n } catch (error) {\n this.logger.error(this.name, '活体检测失败', error as Error);\n throw new Error(`活体检测失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 比对两个人脸\n * @param face1 第一个人脸图像\n * @param face2 第二个人脸图像\n * @returns 人脸比对结果\n */\n public async compareFaces(\n face1: ImageData | HTMLImageElement | HTMLCanvasElement,\n face2: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<FaceComparisonResult> {\n this.ensureInitialized();\n \n try {\n // 在此处实现人脸比对逻辑\n // 这里只是示例,实际实现需要根据具体的人脸比对算法来实现\n const similarity = 0.85;\n const isMatch = similarity >= (this.options.comparison?.minSimilarity || 0.8);\n \n const comparisonResult: FaceComparisonResult = {\n isMatch,\n similarity,\n confidence: 0.9\n };\n \n // 触发事件\n this.emit('face:compared', { result: comparisonResult });\n \n return comparisonResult;\n } catch (error) {\n this.logger.error(this.name, '人脸比对失败', error as Error);\n throw new Error(`人脸比对失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 获取最后一次检测结果\n */\n public getLastDetectionResult(): FaceDetectionResult | undefined {\n return this.lastDetectionResult;\n }\n \n /**\n * 释放模块资源\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放人脸模块资源');\n \n try {\n // 在此处释放人脸检测、活体检测和人脸比对所需的模型资源\n // 这里只是示例,实际实现需要根据具体的人脸识别库来实现\n \n // 调用基类的dispose方法\n await super.dispose();\n } catch (error) {\n this.logger.error(this.name, '人脸模块资源释放失败', error as Error);\n throw new Error(`人脸模块资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// 导出类型\nexport * from './types'; ","/**\n * @file 加载状态管理\n * @description 提供模块加载状态跟踪功能\n * @module core/loading-state\n */\n\nimport { EventEmitter } from './event-emitter';\n\n/**\n * 加载状态类型\n */\nexport enum LoadingState {\n /** 空闲 */\n IDLE = 'idle',\n /** 加载中 */\n LOADING = 'loading',\n /** 就绪 */\n READY = 'ready',\n /** 错误 */\n ERROR = 'error',\n /** 已释放 */\n DISPOSED = 'disposed'\n}\n\n/**\n * 加载进度信息\n */\nexport interface LoadingProgress {\n /** 当前状态 */\n state: LoadingState;\n /** 已加载的模型 */\n loadedModels: string[];\n /** 正在加载的模型 */\n loadingModel?: string;\n /** 进度百分比 (0-100) */\n progress: number;\n /** 错误信息 */\n error?: string;\n}\n\n/**\n * 加载状态管理器\n * 用于跟踪和管理模块的加载状态\n */\nexport class LoadingStateManager extends EventEmitter {\n private state: LoadingState = LoadingState.IDLE;\n private loadedModels: Set<string> = new Set();\n private loadingModel?: string;\n private totalModels: number = 0;\n private error?: string;\n\n /**\n * 开始加载\n * @param totalModels 总模型数\n */\n startLoading(totalModels: number): void {\n this.totalModels = totalModels;\n this.state = LoadingState.LOADING;\n this.error = undefined;\n this.emit('stateChange', this.getProgress());\n }\n\n /**\n * 模型开始加载\n * @param modelName 模型名称\n */\n startModelLoading(modelName: string): void {\n this.loadingModel = modelName;\n this.emit('progress', this.getProgress());\n }\n\n /**\n * 模型加载完成\n * @param modelName 模型名称\n */\n completeModelLoading(modelName: string): void {\n this.loadedModels.add(modelName);\n this.loadingModel = undefined;\n this.emit('progress', this.getProgress());\n }\n\n /**\n * 加载完成\n */\n complete(): void {\n this.state = LoadingState.READY;\n this.totalModels = 0;\n this.emit('stateChange', this.getProgress());\n }\n\n /**\n * 加载失败\n * @param error 错误信息\n */\n fail(error: string): void {\n this.state = LoadingState.ERROR;\n this.error = error;\n this.emit('error', { error, progress: this.getProgress() });\n }\n\n /**\n * 释放\n */\n dispose(): void {\n this.state = LoadingState.DISPOSED;\n this.loadedModels.clear();\n this.totalModels = 0;\n this.error = undefined;\n this.emit('stateChange', this.getProgress());\n }\n\n /**\n * 获取当前进度\n */\n getProgress(): LoadingProgress {\n const progress = this.totalModels > 0 \n ? Math.round((this.loadedModels.size / this.totalModels) * 100) \n : 0;\n\n return {\n state: this.state,\n loadedModels: Array.from(this.loadedModels),\n loadingModel: this.loadingModel,\n progress,\n error: this.error\n };\n }\n\n /**\n * 获取当前状态\n */\n getState(): LoadingState {\n return this.state;\n }\n\n /**\n * 是否已就绪\n */\n isReady(): boolean {\n return this.state === LoadingState.READY;\n }\n\n /**\n * 是否有错误\n */\n hasError(): boolean {\n return this.state === LoadingState.ERROR;\n }\n}\n\n/**\n * 创建加载状态管理器\n */\nexport function createLoadingStateManager(): LoadingStateManager {\n return new LoadingStateManager();\n}\n","/**\n * @file 错误处理模块\n * @description 定义ID-Scanner-Lib的错误类层次结构\n * @module core/errors\n */\n\n/**\n * ID-Scanner-Lib 基础错误类\n * 所有库特定错误的基类\n */\nexport class IDScannerError extends Error {\n /** 错误代码 */\n public code: string;\n /** 错误原因 */\n public cause?: Error;\n\n /**\n * 构造函数\n * @param message 错误消息\n * @param options 错误选项\n */\n constructor(message: string, options?: { code?: string; cause?: Error }) {\n super(message);\n \n // 设置错误名称\n this.name = this.constructor.name;\n \n // 设置错误代码\n this.code = options?.code || 'UNKNOWN_ERROR';\n \n // 设置错误原因\n this.cause = options?.cause;\n \n // 捕获堆栈 (Node.js专有,浏览器环境忽略)\n if (typeof (Error as any).captureStackTrace === 'function') {\n (Error as any).captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * 初始化错误\n * 当库初始化失败时抛出\n */\nexport class InitializationError extends IDScannerError {\n constructor(message: string, details?: string) {\n super(`初始化失败: ${message}${details ? ` (${details})` : ''}`, { code: 'INIT_FAILED' });\n this.name = 'InitializationError';\n }\n}\n\n/**\n * 设备错误\n * 当访问硬件设备(如摄像头)失败时抛出\n */\nexport class DeviceError extends IDScannerError {\n constructor(message: string) {\n super(`设备错误: ${message}`, { code: 'DEVICE_ERROR' });\n this.name = 'DeviceError';\n }\n}\n\n/**\n * 摄像头访问错误\n * 当无法访问或启动摄像头时抛出\n */\nexport class CameraAccessError extends IDScannerError {\n constructor(message: string, options?: { code?: string; cause?: Error }) {\n super(`摄像头访问失败: ${message}`, {\n code: options?.code || 'CAMERA_ACCESS_FAILED',\n cause: options?.cause\n });\n this.name = 'CameraAccessError';\n }\n}\n\n/**\n * 人脸检测错误\n * 当人脸检测过程失败时抛出\n */\nexport class FaceDetectionError extends IDScannerError {\n constructor(message: string) {\n super(`人脸检测失败: ${message}`, { code: 'FACE_DETECTION_FAILED' });\n this.name = 'FaceDetectionError';\n }\n}\n\n/**\n * 人脸比对错误\n * 当人脸比对过程失败时抛出\n */\nexport class FaceComparisonError extends IDScannerError {\n constructor(message: string) {\n super(`人脸比对失败: ${message}`, { code: 'FACE_COMPARISON_FAILED' });\n this.name = 'FaceComparisonError';\n }\n}\n\n/**\n * 活体检测错误\n * 当活体检测过程失败时抛出\n */\nexport class LivenessDetectionError extends IDScannerError {\n constructor(message: string) {\n super(`活体检测失败: ${message}`, { code: 'LIVENESS_DETECTION_FAILED' });\n this.name = 'LivenessDetectionError';\n }\n}\n\n/**\n * OCR识别错误\n * 当OCR文字识别失败时抛出\n */\nexport class OCRProcessingError extends IDScannerError {\n constructor(message: string) {\n super(`OCR处理失败: ${message}`, { code: 'OCR_PROCESSING_FAILED' });\n this.name = 'OCRProcessingError';\n }\n}\n\n/**\n * 二维码扫描错误\n * 当二维码扫描失败时抛出\n */\nexport class QRScanError extends IDScannerError {\n constructor(message: string) {\n super(`二维码扫描失败: ${message}`, { code: 'QR_SCAN_FAILED' });\n this.name = 'QRScanError';\n }\n}\n\n/**\n * 身份证检测错误\n * 当身份证检测失败时抛出\n */\nexport class IDCardDetectionError extends IDScannerError {\n constructor(message: string) {\n super(`身份证检测失败: ${message}`, { code: 'ID_CARD_DETECTION_FAILED' });\n this.name = 'IDCardDetectionError';\n }\n}\n\n/**\n * 资源加载错误\n * 当无法加载必要资源(如模型)时抛出\n */\nexport class ResourceLoadError extends IDScannerError {\n constructor(resource: string, reason: string) {\n super(`无法加载资源 ${resource}: ${reason}`, { code: 'RESOURCE_LOAD_FAILED' });\n this.name = 'ResourceLoadError';\n }\n}\n\n/**\n * 参数错误\n * 当提供的参数无效时抛出\n */\nexport class InvalidArgumentError extends IDScannerError {\n constructor(paramName: string, reason: string) {\n super(`无效的参数 ${paramName}: ${reason}`, { code: 'INVALID_ARGUMENT' });\n this.name = 'InvalidArgumentError';\n }\n}\n\n/**\n * 不支持错误\n * 当尝试使用不支持的功能或当前环境无法使用的功能时抛出\n */\nexport class NotSupportedError extends IDScannerError {\n constructor(feature: string) {\n super(`不支持的功能: ${feature}`, { code: 'NOT_SUPPORTED' });\n this.name = 'NotSupportedError';\n }\n} ","/**\n * @file 主入口文件\n * @description ID Scanner库的主入口点,提供统一的API和模块导出\n * @module index\n */\n\nimport { ModuleManager } from './core/module-manager';\nimport { IDCardModule } from './modules/id-card';\nimport { QRCodeModule } from './modules/qrcode';\nimport { FaceModule } from './modules/face';\nimport { VERSION, BUILD_DATE } from './version';\nimport { Logger, LogLevel } from './core/logger';\nimport { IDCardModuleOptions } from './modules/id-card/types';\nimport { QRCodeModuleOptions } from './modules/qrcode/types';\nimport { FaceModuleOptions } from './modules/face/types';\n\n/**\n * IDScanner配置选项\n */\nexport interface IDScannerOptions {\n /** 日志级别 */\n logLevel?: LogLevel;\n /** 是否启用身份证识别模块 */\n enableIDCard?: boolean;\n /** 是否启用二维码识别模块 */\n enableQRCode?: boolean;\n /** 是否启用人脸识别模块 */\n enableFace?: boolean;\n /** 身份证模块配置 */\n idCard?: IDCardModuleOptions;\n /** 二维码模块配置 */\n qrCode?: QRCodeModuleOptions;\n /** 人脸识别模块配置 */\n face?: FaceModuleOptions;\n}\n\n/**\n * IDScanner类\n * 提供整合的身份证、二维码和人脸识别功能\n */\nexport class IDScanner {\n /** 版本号 */\n public static readonly VERSION = VERSION;\n /** 构建日期 */\n public static readonly BUILD_DATE = BUILD_DATE;\n \n /** 模块管理器 */\n private moduleManager: ModuleManager;\n /** 是否已经初始化 */\n private initialized = false;\n /** 日志工具 */\n private logger: Logger;\n \n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(options: IDScannerOptions = {}) {\n // 配置日志级别\n this.logger = Logger.getInstance();\n if (options.logLevel !== undefined) {\n this.logger.setLevel(options.logLevel);\n }\n \n this.moduleManager = ModuleManager.getInstance();\n \n // 注册模块\n if (options.enableIDCard !== false) {\n this.moduleManager.register(new IDCardModule(options.idCard));\n }\n \n if (options.enableQRCode !== false) {\n this.moduleManager.register(new QRCodeModule(options.qrCode));\n }\n \n if (options.enableFace !== false) {\n this.moduleManager.register(new FaceModule(options.face));\n }\n }\n\n /**\n * 初始化库\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.logger.info('IDScanner', `初始化 IDScanner v${VERSION}`);\n\n try {\n // 初始化所有模块\n await this.moduleManager.initialize();\n\n this.initialized = true;\n this.logger.info('IDScanner', 'IDScanner初始化完成');\n } catch (error) {\n this.logger.error('IDScanner', 'IDScanner初始化失败', error as Error);\n throw new Error(`IDScanner初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * 获取身份证模块实例\n * @returns 身份证模块\n */\n public getIDCardModule(): IDCardModule | undefined {\n return this.moduleManager.getModule<IDCardModule>('id-card');\n }\n \n /**\n * 获取二维码模块实例\n * @returns 二维码模块\n */\n public getQRCodeModule(): QRCodeModule | undefined {\n return this.moduleManager.getModule<QRCodeModule>('qrcode');\n }\n \n /**\n * 获取人脸识别模块实例\n * @returns 人脸识别模块\n */\n public getFaceModule(): FaceModule | undefined {\n return this.moduleManager.getModule<FaceModule>('face');\n }\n \n /**\n * 释放所有资源\n */\n public async dispose(): Promise<void> {\n if (!this.initialized) {\n return;\n }\n \n this.logger.info('IDScanner', '释放IDScanner资源');\n \n try {\n await this.moduleManager.dispose();\n \n this.initialized = false;\n this.logger.info('IDScanner', 'IDScanner资源已释放');\n } catch (error) {\n this.logger.error('IDScanner', 'IDScanner资源释放失败', error as Error);\n throw new Error(`IDScanner资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// 导出核心模块\nexport * from './core/loading-state';\nexport * from './core/module-manager';\nexport * from './core/logger';\nexport * from './core/errors';\n\n// 导出功能模块 (明确导出以避免命名冲突)\nexport { IDCardModule } from './modules/id-card';\nexport { QRCodeModule } from './modules/qrcode';\nexport { FaceModule } from './modules/face';\n\n// 导出类型\nexport * from './utils/types';\nexport { IDCardModuleOptions, IDCardInfo, IDCardType, IDCardVerificationResult } from './modules/id-card/types';\nexport { QRCodeModuleOptions, QRCodeResult, BarcodeFormat, DEFAULT_FORMATS } from './modules/qrcode/types';\nexport { FaceModuleOptions, FaceDetectionResult, FaceComparisonResult } from './modules/face/types';\n\n// 默认导出IDScanner类\nexport default IDScanner;\n"],"names":["createCustomWorker","createWorker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"id-scanner-lib.esm.js","sources":["../src/core/config.ts","../src/core/logger.ts","../src/core/event-emitter.ts","../src/version.ts","../src/core/module-manager.ts","../src/core/base-module.ts","../src/core/result.ts","../src/modules/id-card/types.ts","../src/modules/id-card/id-card-detector.ts","../src/utils/image-processing.ts","../src/utils/performance.ts","../src/utils/worker.ts","../src/modules/id-card/ocr-worker.ts","../src/modules/id-card/ocr-processor.ts","../src/modules/id-card/anti-fake-detector.ts","../src/modules/id-card/index.ts","../src/modules/qrcode/types.ts","../src/modules/qrcode/qr-code-scanner.ts","../src/modules/qrcode/index.ts","../src/modules/face/index.ts","../src/core/loading-state.ts","../src/core/errors.ts","../src/index.ts"],"sourcesContent":["/**\n * @file 配置管理器\n * @description 提供全局配置管理功能\n * @module core/config\n */\n\n/**\n * 配置管理器\n * 负责存储和管理应用程序的配置\n */\nexport class ConfigManager {\n /** 单例实例 */\n private static instance: ConfigManager;\n \n /** 配置存储 */\n private config: Record<string, any> = {};\n \n /** 配置变更回调 */\n private changeCallbacks: Map<string, Array<(value: any, oldValue: any) => void>> = new Map();\n \n /** 初始化状态 */\n private initialized = false;\n \n /**\n * 私有构造函数\n */\n private constructor() {\n // 设置默认配置\n this._resetDefaults();\n }\n \n /**\n * 获取单例实例\n */\n public static getInstance(): ConfigManager {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager();\n }\n return ConfigManager.instance;\n }\n\n /**\n * 重置单例实例(主要用于测试)\n */\n public static resetInstance(): void {\n ConfigManager.instance = undefined as any;\n }\n\n /**\n * 重置为默认配置\n */\n private _resetDefaults(): void {\n this.config = {\n debug: false,\n logLevel: 'info',\n camera: {\n resolution: {\n width: 1280,\n height: 720\n },\n frameRate: 30,\n facingMode: 'environment'\n },\n performance: {\n useCache: true\n }\n };\n this.initialized = true;\n }\n \n /**\n * 获取配置值\n * @param key 配置键,支持点号分隔的路径\n * @param defaultValue 默认值\n */\n get<T = any>(key: string, defaultValue?: T): T {\n const value = this.getNestedValue(this.config, key);\n return (value !== undefined) ? value : (defaultValue as T);\n }\n \n /**\n * 设置配置值\n * @param key 配置键,支持点号分隔的路径\n * @param value 配置值\n */\n set<T = any>(key: string, value: T): void {\n const oldValue = this.get(key);\n \n // 如果值相同,不做任何事\n if (oldValue === value) {\n return;\n }\n \n this.setNestedValue(this.config, key, value);\n \n // 触发变更回调\n this.triggerChangeCallbacks(key, value, oldValue);\n }\n \n /**\n * 批量更新配置\n * @param config 配置对象\n */\n updateConfig(config: Record<string, any>): void {\n Object.entries(config).forEach(([key, value]) => {\n this.set(key, value);\n });\n }\n \n /**\n * 重置为默认配置\n */\n reset(): void {\n const oldConfig = { ...this.config };\n \n // 使用私有 reset 方法重建默认配置\n this.config = {\n debug: false,\n logLevel: 'info',\n camera: {\n resolution: {\n width: 1280,\n height: 720\n },\n frameRate: 30,\n facingMode: 'environment'\n },\n performance: {\n useCache: true\n }\n };\n \n // 触发所有回调\n Object.keys(oldConfig).forEach(key => {\n this.triggerChangeCallbacks(key, this.get(key), oldConfig[key]);\n });\n }\n \n /**\n * 注册配置变更回调\n * @param key 配置键\n * @param callback 回调函数\n */\n onConfigChange<T = any>(key: string, callback: (value: T, oldValue: T) => void): void {\n if (!this.changeCallbacks.has(key)) {\n this.changeCallbacks.set(key, []);\n }\n \n this.changeCallbacks.get(key)!.push(callback);\n }\n \n /**\n * 移除配置变更回调\n * @param key 配置键\n * @param callback 特定回调函数,如不提供则移除所有\n */\n offConfigChange<T = any>(key: string, callback?: (value: T, oldValue: T) => void): void {\n if (!this.changeCallbacks.has(key)) {\n return;\n }\n \n if (callback) {\n // 移除特定回调\n const callbacks = this.changeCallbacks.get(key)!;\n const index = callbacks.indexOf(callback as any);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n \n // 如果没有回调,删除键\n if (callbacks.length === 0) {\n this.changeCallbacks.delete(key);\n }\n } else {\n // 移除所有回调\n this.changeCallbacks.delete(key);\n }\n }\n \n /**\n * 获取嵌套值\n * @param obj 对象\n * @param path 路径\n */\n private getNestedValue(obj: Record<string, any>, path: string): any {\n // 处理根路径\n if (!path) {\n return obj;\n }\n \n // 处理嵌套路径\n const parts = path.split('.');\n let current = obj;\n \n for (const part of parts) {\n if (current === undefined || current === null) {\n return undefined;\n }\n \n current = current[part];\n }\n \n return current;\n }\n \n /**\n * 设置嵌套值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\n private setNestedValue(obj: Record<string, any>, path: string, value: any): void {\n // 处理根路径\n if (!path) {\n return;\n }\n \n // 处理嵌套路径\n const parts = path.split('.');\n let current = obj;\n \n // 遍历路径,直到倒数第二部分\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n \n // 如果不存在,创建新对象\n if (current[part] === undefined || current[part] === null || typeof current[part] !== 'object') {\n current[part] = {};\n }\n \n current = current[part];\n }\n \n // 设置最终值\n current[parts[parts.length - 1]] = value;\n }\n \n /**\n * 触发变更回调\n * @param key 配置键\n * @param value 新值\n * @param oldValue 旧值\n */\n private triggerChangeCallbacks(key: string, value: any, oldValue: any): void {\n // 触发特定键的回调\n if (this.changeCallbacks.has(key)) {\n const callbacks = this.changeCallbacks.get(key)!;\n callbacks.forEach(callback => {\n try {\n callback(value, oldValue);\n } catch (error) {\n console.error(`Error in config change callback for key ${key}:`, error);\n }\n });\n }\n \n // 触发父路径的回调\n const parts = key.split('.');\n while (parts.length > 1) {\n parts.pop();\n const parentKey = parts.join('.');\n \n if (this.changeCallbacks.has(parentKey)) {\n const parentValue = this.get(parentKey);\n this.changeCallbacks.get(parentKey)!.forEach(callback => {\n try {\n callback(parentValue, parentValue);\n } catch (error) {\n console.error(`Error in config change callback for parent key ${parentKey}:`, error);\n }\n });\n }\n }\n }\n\n /**\n * 检查模块是否启用\n * @param moduleName 模块名称\n */\n public isModuleEnabled(moduleName: string): boolean {\n const key = `modules.${moduleName}.enabled`;\n return this.get(key) ?? false;\n }\n}\n\n/**\n * 全局配置接口\n */\nexport interface GlobalConfig {\n /** 版本号 */\n version: string;\n /** 调试模式 */\n debug: boolean;\n /** 日志级别 */\n logLevel: string;\n /** 摄像头配置 */\n camera: {\n resolution: { width: number; height: number };\n frameRate: number;\n facingMode: string;\n };\n /** 性能配置 */\n performance: {\n useCache: boolean;\n };\n /** 模块配置 */\n modules: {\n face: { enabled: boolean };\n idcard: { enabled: boolean };\n qrcode: { enabled: boolean };\n };\n} \n\n/**\n * 模块配置接口\n * 定义所有模块共享的基础配置属性\n */\nexport interface ModuleConfig {\n /** 是否启用该模块 */\n enabled: boolean;\n /** 其他模块特定配置 */\n [key: string]: any;\n} ","/**\n * @file 日志系统\n * @description 提供统一的日志记录与管理功能\n * @module core/logger\n */\n\nimport { ConfigManager } from './config';\n\n/**\n * 日志级别枚举\n */\nexport enum LogLevel {\n DEBUG = 'debug',\n INFO = 'info',\n WARN = 'warn',\n ERROR = 'error'\n}\n\n/**\n * 日志条目接口\n */\nexport interface LogEntry {\n /** 日志级别 */\n level: LogLevel;\n /** 日志标签 */\n tag: string;\n /** 日志消息 */\n message: string;\n /** 时间戳 */\n timestamp: number;\n /** 额外数据 */\n data?: any;\n /** 错误 */\n error?: Error;\n}\n\n/**\n * 日志处理器接口\n */\nexport interface LogHandler {\n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void;\n}\n\n/**\n * 控制台日志处理器\n * 将日志输出到浏览器控制台\n */\nexport class ConsoleLogHandler implements LogHandler {\n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void {\n const timestamp = new Date(entry.timestamp).toISOString();\n const prefix = `[${timestamp}] [${entry.level.toUpperCase()}] [${entry.tag}]`;\n \n switch (entry.level) {\n case LogLevel.DEBUG:\n console.debug(prefix, entry.message, entry.error || '');\n break;\n case LogLevel.INFO:\n console.info(prefix, entry.message, entry.error || '');\n break;\n case LogLevel.WARN:\n console.warn(prefix, entry.message, entry.error || '');\n break;\n case LogLevel.ERROR:\n console.error(prefix, entry.message, entry.error || '');\n break;\n default:\n // 输出什么也不做\n }\n }\n}\n\n/**\n * 内存日志处理器\n * 将日志保存在内存中,用于后续分析或显示\n */\nexport class MemoryLogHandler implements LogHandler {\n /** 日志条目数组 */\n private entries: LogEntry[] = [];\n /** 最大日志条目数 */\n private maxEntries: number;\n \n /**\n * 构造函数\n * @param maxEntries 最大日志条目数,默认为1000\n */\n constructor(maxEntries: number = 1000) {\n this.maxEntries = maxEntries;\n }\n \n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void {\n this.entries.push(entry);\n \n // 如果超过最大条目数,移除最老的\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n \n /**\n * 获取所有日志条目\n */\n getEntries(): LogEntry[] {\n return [...this.entries];\n }\n \n /**\n * 根据级别过滤日志条目\n * @param level 日志级别\n */\n getEntriesByLevel(level: LogLevel): LogEntry[] {\n return this.entries.filter(entry => entry.level === level);\n }\n \n /**\n * 根据标签过滤日志条目\n * @param tag 日志标签\n */\n getEntriesByTag(tag: string): LogEntry[] {\n return this.entries.filter(entry => entry.tag === tag);\n }\n \n /**\n * 清空日志\n */\n clear(): void {\n this.entries = [];\n }\n}\n\n/**\n * 远程日志处理器\n * 将日志发送到远程服务器\n */\nexport class RemoteLogHandler implements LogHandler {\n /** 远程服务器URL */\n private endpoint: string;\n /** 批量发送的队列 */\n private queue: LogEntry[] = [];\n /** 最大队列长度 */\n private maxQueueSize: number;\n /** 发送间隔(毫秒) */\n private flushInterval: number;\n /** 定时发送的计时器ID */\n private timerId: number | null = null;\n \n /**\n * 构造函数\n * @param endpoint 远程服务器URL\n * @param maxQueueSize 最大队列长度,默认为100\n * @param flushInterval 发送间隔(毫秒),默认为5000\n */\n constructor(endpoint: string, maxQueueSize: number = 100, flushInterval: number = 5000) {\n this.endpoint = endpoint;\n this.maxQueueSize = maxQueueSize;\n this.flushInterval = flushInterval;\n \n // 设置定时发送\n this.startTimer();\n \n // 页面卸载前尝试发送剩余日志\n window.addEventListener('beforeunload', () => {\n this.flush();\n });\n }\n \n /**\n * 处理日志条目\n * @param entry 日志条目\n */\n handle(entry: LogEntry): void {\n // 只处理INFO以上级别的日志\n if (entry.level >= LogLevel.INFO) {\n this.queue.push(entry);\n \n // 如果队列满了,立即发送\n if (this.queue.length >= this.maxQueueSize) {\n this.flush();\n }\n }\n }\n \n /**\n * 发送队列中的日志\n */\n flush(): void {\n if (this.queue.length === 0) return;\n \n const entriesToSend = [...this.queue];\n this.queue = [];\n \n // 防止在 fetch 失败时无限重试\n const sendCount = (this as any)._sendCount || 0;\n (this as any)._sendCount = sendCount + 1;\n \n // 如果发送次数过多,停止发送以防止无限循环\n if (sendCount > 10) {\n console.warn('RemoteLogHandler: Too many failed sends, stopping. Clear queue.');\n this.queue = [];\n (this as any)._sendCount = 0;\n return;\n }\n \n try {\n fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(entriesToSend),\n // 不等待响应,避免阻塞\n keepalive: true\n }).catch((err: Error) => {\n console.error('Failed to send logs to remote server:', err);\n // 失败时把日志放回队列,但防止无限增长\n if (this.queue.length < this.maxQueueSize) {\n // 限制放回的数量,防止内存溢出\n const maxReturn = Math.min(entriesToSend.length, this.maxQueueSize - this.queue.length);\n const returnedEntries = entriesToSend.slice(0, maxReturn);\n this.queue = [...returnedEntries, ...this.queue];\n }\n // 重置发送计数,允许后续重试\n (this as any)._sendCount = 0;\n });\n } catch (error) {\n console.error('Error sending logs:', error);\n }\n }\n \n /**\n * 开始定时发送\n */\n startTimer(): void {\n if (this.timerId !== null) return;\n \n this.timerId = window.setInterval(() => {\n this.flush();\n }, this.flushInterval);\n }\n \n /**\n * 停止定时发送\n */\n stopTimer(): void {\n if (this.timerId !== null) {\n window.clearInterval(this.timerId);\n this.timerId = null;\n }\n }\n}\n\n/**\n * 日志管理类\n * 中央日志管理器,提供统一的日志记录接口\n */\nexport class Logger {\n /** 单例实例 */\n private static instance: Logger;\n /** 配置管理器 */\n private config: ConfigManager;\n /** 日志处理器 */\n private handlers: LogHandler[] = [];\n /** 默认标签 */\n private defaultTag: string = 'IDScanner';\n /** 日志级别 */\n private logLevel: LogLevel = LogLevel.INFO;\n \n /**\n * 私有构造函数,防止直接实例化\n */\n private constructor() {\n this.config = ConfigManager.getInstance();\n \n // 默认添加控制台处理器\n this.addHandler(new ConsoleLogHandler());\n \n // 监听配置变化\n this.config.onConfigChange('logLevel', (level: LogLevel) => {\n this.debug('Logger', `Log level changed to ${level}`);\n });\n }\n \n /**\n * 获取单例实例\n */\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n \n /**\n * 添加日志处理器\n * @param handler 日志处理器\n */\n addHandler(handler: LogHandler): void {\n this.handlers.push(handler);\n }\n \n /**\n * 移除日志处理器\n * @param handler 要移除的处理器\n */\n removeHandler(handler: LogHandler): void {\n const index = this.handlers.indexOf(handler);\n if (index !== -1) {\n this.handlers.splice(index, 1);\n }\n }\n \n /**\n * 移除所有处理器\n */\n clearHandlers(): void {\n this.handlers = [];\n }\n \n /**\n * 设置默认标签\n * @param tag 默认标签\n */\n setDefaultTag(tag: string): void {\n this.defaultTag = tag;\n }\n \n /**\n * 记录调试级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n debug(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.DEBUG, tag, message, error);\n }\n \n /**\n * 记录信息级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n info(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.INFO, tag, message, error);\n }\n \n /**\n * 记录警告级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n warn(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.WARN, tag, message, error);\n }\n \n /**\n * 记录错误级别日志\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n error(tag: string, message: string, error?: Error): void {\n this.log(LogLevel.ERROR, tag, message, error);\n }\n \n /**\n * 创建标记了特定标签的日志记录器\n * @param tag 标签\n */\n getTaggedLogger(tag: string): TaggedLogger {\n return new TaggedLogger(this, tag);\n }\n \n /**\n * 记录日志\n * @param level 日志级别\n * @param tag 标签\n * @param message 消息\n * @param error 错误\n */\n private log(level: LogLevel, tag: string, message: string, error?: Error): void {\n // 检查日志级别\n const levelValue = this.getLevelValue(level);\n const currentLevelValue = this.getLevelValue(this.logLevel);\n \n if (levelValue < currentLevelValue) {\n return;\n }\n \n // 创建日志条目\n const entry: LogEntry = {\n timestamp: Date.now(),\n level: level,\n tag: tag || this.defaultTag,\n message,\n error\n };\n \n // 分发到所有处理程序\n for (const handler of this.handlers) {\n try {\n handler.handle(entry);\n } catch (handlerError) {\n console.error(`[Logger] 处理程序错误:`, handlerError);\n }\n }\n \n // 如果没有处理程序,使用控制台\n if (this.handlers.length === 0) {\n this.consoleOutput(entry);\n }\n }\n\n /**\n * 控制台输出\n * @param entry 日志条目\n */\n private consoleOutput(entry: LogEntry): void {\n const timestamp = new Date(entry.timestamp).toISOString();\n const prefix = `[${timestamp}] [${entry.level.toUpperCase()}] [${entry.tag}]`;\n \n switch (entry.level) {\n case LogLevel.DEBUG:\n console.debug(`${prefix} ${entry.message}`, entry.error || '');\n break;\n case LogLevel.INFO:\n console.info(`${prefix} ${entry.message}`, entry.error || '');\n break;\n case LogLevel.WARN:\n console.warn(`${prefix} ${entry.message}`, entry.error || '');\n break;\n case LogLevel.ERROR:\n console.error(`${prefix} ${entry.message}`, entry.error || '');\n break;\n }\n }\n\n /**\n * 获取日志级别值\n * @param level 日志级别\n */\n private getLevelValue(level: LogLevel): number {\n switch (level) {\n case LogLevel.DEBUG:\n return 0;\n case LogLevel.INFO:\n return 1;\n case LogLevel.WARN:\n return 2;\n case LogLevel.ERROR:\n return 3;\n default:\n return 1; // 默认INFO级别\n }\n }\n\n /**\n * 设置日志级别\n * @param level 日志级别\n */\n public setLevel(level: LogLevel | string): void {\n if (typeof level === 'string') {\n switch (level) {\n case 'debug':\n this.logLevel = LogLevel.DEBUG;\n break;\n case 'info':\n this.logLevel = LogLevel.INFO;\n break;\n case 'warn':\n this.logLevel = LogLevel.WARN;\n break;\n case 'error':\n this.logLevel = LogLevel.ERROR;\n break;\n default:\n this.logLevel = LogLevel.INFO;\n }\n } else {\n this.logLevel = level;\n }\n \n this.debug('Logger', `日志级别已设置为 ${this.logLevel}`);\n }\n\n /**\n * 获取当前日志级别\n * @returns 当前日志级别\n */\n public getLevel(): LogLevel {\n return this.logLevel;\n }\n}\n\n/**\n * 带标签的日志记录器\n * 提供特定标签的简易日志接口\n */\nexport class TaggedLogger {\n /** 所属的主日志记录器 */\n private logger: Logger;\n /** 标签 */\n private tag: string;\n \n /**\n * 构造函数\n * @param logger 所属的主日志记录器\n * @param tag 标签\n */\n constructor(logger: Logger, tag: string) {\n this.logger = logger;\n this.tag = tag;\n }\n \n /**\n * 记录调试级别日志\n * @param message 消息\n * @param error 错误\n */\n debug(message: string, error?: Error): void {\n this.logger.debug(this.tag, message, error);\n }\n \n /**\n * 记录信息级别日志\n * @param message 消息\n * @param error 错误\n */\n info(message: string, error?: Error): void {\n this.logger.info(this.tag, message, error);\n }\n \n /**\n * 记录警告级别日志\n * @param message 消息\n * @param error 错误\n */\n warn(message: string, error?: Error): void {\n this.logger.warn(this.tag, message, error);\n }\n \n /**\n * 记录错误级别日志\n * @param message 消息\n * @param error 错误\n */\n error(message: string, error?: Error): void {\n this.logger.error(this.tag, message, error);\n }\n}\n\n/**\n * 日志级别枚举\n */\n","/**\n * @file 事件发射器\n * @description 提供基础的事件发射和订阅功能\n * @module core/event-emitter\n */\n\n/**\n * 事件处理器类型\n */\ntype EventHandler = (data?: any) => void;\n\n/**\n * 事件发射器基类\n * 提供基础的事件发射和订阅功能\n */\nexport class EventEmitter {\n /** 事件处理器映射 */\n private eventHandlers: Map<string, Set<EventHandler>> = new Map();\n \n /**\n * 订阅事件\n * @param eventName 事件名称\n * @param handler 事件处理器\n */\n on(eventName: string, handler: EventHandler): void {\n if (!this.eventHandlers.has(eventName)) {\n this.eventHandlers.set(eventName, new Set());\n }\n \n this.eventHandlers.get(eventName)!.add(handler);\n }\n \n /**\n * 取消订阅事件\n * @param eventName 事件名称\n * @param handler 事件处理器,如果不提供则移除该事件的所有处理器\n */\n off(eventName: string, handler?: EventHandler): void {\n if (!this.eventHandlers.has(eventName)) {\n return;\n }\n \n if (handler) {\n this.eventHandlers.get(eventName)!.delete(handler);\n \n // 如果没有处理器了,删除这个事件\n if (this.eventHandlers.get(eventName)!.size === 0) {\n this.eventHandlers.delete(eventName);\n }\n } else {\n // 移除该事件的所有处理器\n this.eventHandlers.delete(eventName);\n }\n }\n \n /**\n * 订阅事件,但只触发一次\n * @param eventName 事件名称\n * @param handler 事件处理器\n */\n once(eventName: string, handler: EventHandler): void {\n const onceHandler = (data?: any) => {\n handler(data);\n this.off(eventName, onceHandler);\n };\n \n this.on(eventName, onceHandler);\n }\n \n /**\n * 发射事件\n * @param eventName 事件名称\n * @param data 事件数据\n */\n emit(eventName: string, data?: any): void {\n if (!this.eventHandlers.has(eventName)) {\n return;\n }\n \n for (const handler of this.eventHandlers.get(eventName)!) {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in event handler for \"${eventName}\":`, error);\n }\n }\n }\n \n /**\n * 获取某个事件的处理器数量\n * @param eventName 事件名称\n */\n listenerCount(eventName: string): number {\n return this.eventHandlers.has(eventName) ? this.eventHandlers.get(eventName)!.size : 0;\n }\n \n /**\n * 移除所有事件处理器\n */\n removeAllListeners(): void {\n this.eventHandlers.clear();\n }\n \n /**\n * 获取所有事件名称\n */\n eventNames(): string[] {\n return Array.from(this.eventHandlers.keys());\n }\n} ","/**\n * @file 版本号文件\n * @description 定义库的版本号\n * @module Version\n */\n\n// 当前版本号\nexport const VERSION = '1.3.3';\n\n// 构建日期\nexport const BUILD_DATE = new Date().toISOString(); ","/* eslint-disable */\n/**\n * @file 模块管理器\n * @description 统一管理库的各功能模块,提供模块的注册、初始化和卸载功能\n * @module core/module-manager\n */\n\nimport { Logger } from './logger';\nimport { EventEmitter } from './event-emitter';\nimport { VERSION } from '../version';\n\n/**\n * 模块接口\n * 所有功能模块必须实现此接口\n */\nexport interface Module {\n /** 模块名称 */\n name: string;\n \n /** 模块版本 */\n version: string;\n \n /** 模块是否已初始化 */\n isInitialized: boolean;\n \n /** 初始化模块 */\n initialize(): Promise<void>;\n \n /** 释放模块资源 */\n dispose(): Promise<void>;\n}\n\n/**\n * 模块配置接口\n */\nexport interface ModuleOptions {\n /** 是否启用该模块 */\n enabled?: boolean;\n \n /** 模块特定配置 */\n [key: string]: any;\n}\n\n/**\n * 模块管理器类\n * 负责管理所有功能模块的生命周期\n */\nexport class ModuleManager extends EventEmitter {\n private static instance: ModuleManager;\n private modules: Map<string, Module> = new Map();\n private logger: Logger;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n \n /**\n * 获取模块管理器单例\n */\n public static getInstance(): ModuleManager {\n if (!ModuleManager.instance) {\n ModuleManager.instance = new ModuleManager();\n }\n return ModuleManager.instance;\n }\n\n /**\n * 重置单例实例(主要用于测试)\n */\n public static resetInstance(): void {\n ModuleManager.instance = undefined as any;\n }\n \n /**\n * 私有构造函数,确保单例模式\n */\n private constructor() {\n super();\n this.logger = Logger.getInstance();\n this.logger.debug('ModuleManager', `初始化模块管理器 v${VERSION}`);\n }\n \n /**\n * 注册模块\n * @param module 要注册的模块\n * @returns 模块管理器实例,支持链式调用\n */\n public register(module: Module): ModuleManager {\n if (this.modules.has(module.name)) {\n this.logger.warn('ModuleManager', `模块 \"${module.name}\" 已经注册,将被覆盖`);\n }\n \n this.modules.set(module.name, module);\n this.logger.debug('ModuleManager', `注册模块: ${module.name} v${module.version}`);\n this.emit('module:registered', { name: module.name });\n \n return this;\n }\n \n /**\n * 获取模块\n * @param name 模块名称\n * @returns 模块实例\n */\n public getModule<T extends Module>(name: string): T | undefined {\n return this.modules.get(name) as T | undefined;\n }\n \n /**\n * 初始化所有注册的模块\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n \n this.logger.debug('ModuleManager', '开始初始化所有模块...');\n \n for (const [name, module] of this.modules.entries()) {\n try {\n this.logger.debug('ModuleManager', `初始化模块: ${name}`);\n await module.initialize();\n this.emit('module:initialized', { name });\n this.logger.debug('ModuleManager', `模块 ${name} 初始化完成`);\n } catch (error) {\n this.logger.error('ModuleManager', `模块 ${name} 初始化失败`, error instanceof Error ? error : undefined);\n this.emit('module:error', { name, error });\n throw new Error(`模块 ${name} 初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n this.initialized = true;\n this.logger.debug('ModuleManager', '所有模块初始化完成');\n this.emit('modules:initialized');\n }\n \n /**\n * 卸载所有模块并释放资源\n */\n public async dispose(): Promise<void> {\n this.logger.debug('ModuleManager', '开始释放所有模块资源...');\n \n for (const [name, module] of this.modules.entries()) {\n try {\n this.logger.debug('ModuleManager', `释放模块资源: ${name}`);\n await module.dispose();\n this.emit('module:disposed', { name });\n } catch (error) {\n this.logger.error('ModuleManager', `模块 ${name} 资源释放失败`, error instanceof Error ? error : undefined);\n this.emit('module:error', { name, error });\n }\n }\n \n this.modules.clear();\n this.initialized = false;\n this.logger.debug('ModuleManager', '所有模块资源已释放');\n this.emit('modules:disposed');\n }\n \n /**\n * 获取所有已注册的模块名称\n */\n public getRegisteredModules(): string[] {\n return Array.from(this.modules.keys());\n }\n \n /**\n * 检查模块是否已注册\n * @param name 模块名称\n */\n public hasModule(name: string): boolean {\n return this.modules.has(name);\n }\n} ","/**\n * @file 基础模块\n * @description 提供基础模块实现,作为所有功能模块的基类\n * @module core/base-module\n */\n\nimport { EventEmitter } from './event-emitter';\nimport { Logger } from './logger';\nimport { Module } from './module-manager';\nimport { VERSION } from '../version';\n\n/**\n * 基础模块类\n * 提供模块的基本功能和生命周期管理\n */\nexport abstract class BaseModule extends EventEmitter implements Module {\n /** 模块名称 */\n public abstract readonly name: string;\n \n /** 模块版本 */\n public readonly version: string = VERSION;\n \n /** 模块是否已初始化 */\n protected _isInitialized: boolean = false;\n \n /** 日志工具 */\n protected logger: Logger;\n \n /**\n * 构造函数\n */\n constructor() {\n super();\n this.logger = Logger.getInstance();\n }\n \n /**\n * 获取模块是否已初始化\n */\n public get isInitialized(): boolean {\n return this._isInitialized;\n }\n \n /**\n * 初始化模块\n * 子类必须实现此方法\n */\n public abstract initialize(): Promise<void>;\n \n /**\n * 释放模块资源\n * 子类可以覆盖此方法以添加额外的资源释放逻辑\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放模块资源');\n \n // 重置初始化状态\n this._isInitialized = false;\n \n // 删除所有事件监听器\n this.removeAllListeners();\n \n this.logger.debug(this.name, '模块资源已释放');\n }\n \n /**\n * 检查模块是否已初始化,如果未初始化则抛出错误\n */\n protected ensureInitialized(): void {\n if (!this._isInitialized) {\n throw new Error(`模块 ${this.name} 尚未初始化`);\n }\n }\n} ","/**\n * @file 结果包装类\n * @description 提供统一的操作结果封装\n * @module core/result\n */\n\n/**\n * 结果类型\n * 用于封装操作的成功或失败结果\n */\nexport class Result<T = any> {\n /** 结果数据 */\n private _data?: T;\n /** 错误对象 */\n private _error?: Error;\n /** 是否成功 */\n private _success: boolean;\n /** 额外元数据 */\n private _meta?: Record<string, any>;\n \n /**\n * 构造函数\n * @param success 是否成功\n * @param data 结果数据\n * @param error 错误对象\n * @param meta 元数据\n */\n constructor(\n success: boolean,\n data?: T,\n error?: Error,\n meta?: Record<string, any>\n ) {\n this._success = success;\n this._data = data;\n this._error = error;\n this._meta = meta;\n }\n \n /**\n * 创建成功结果\n * @param data 结果数据\n * @param meta 元数据\n */\n static success<T>(data?: T, meta?: Record<string, any>): Result<T> {\n return new Result<T>(true, data, undefined, meta);\n }\n \n /**\n * 创建失败结果\n * @param error 错误对象\n * @param meta 元数据\n */\n static failure<T>(error: Error, meta?: Record<string, any>): Result<T> {\n return new Result<T>(false, undefined, error, meta);\n }\n \n /**\n * 检查结果是否成功\n */\n isSuccess(): boolean {\n return this._success;\n }\n \n /**\n * 检查结果是否失败\n */\n isFailure(): boolean {\n return !this._success;\n }\n \n /**\n * 获取结果数据\n */\n get data(): T | undefined {\n return this._data;\n }\n \n /**\n * 获取错误对象\n */\n get error(): Error | undefined {\n return this._error;\n }\n \n /**\n * 获取元数据\n */\n get meta(): Record<string, any> | undefined {\n return this._meta;\n }\n \n /**\n * 映射结果(如果成功)\n * @param fn 映射函数\n */\n map<U>(fn: (data: T) => U): Result<U> {\n if (this.isSuccess() && this._data !== undefined) {\n try {\n const newData = fn(this._data);\n return Result.success<U>(newData, this._meta);\n } catch (error) {\n return Result.failure<U>(error instanceof Error ? error : new Error(String(error)), this._meta);\n }\n }\n \n return Result.failure<U>(this._error!, this._meta);\n }\n \n /**\n * 如果成功,则执行函数\n * @param fn 要执行的函数\n */\n onSuccess(fn: (data?: T) => void): Result<T> {\n if (this.isSuccess()) {\n try {\n fn(this._data);\n } catch (error) {\n console.error('Error in onSuccess handler:', error);\n }\n }\n return this;\n }\n \n /**\n * 如果失败,则执行函数\n * @param fn 要执行的函数\n */\n onFailure(fn: (error: Error) => void): Result<T> {\n if (this.isFailure() && this._error) {\n try {\n fn(this._error);\n } catch (error) {\n console.error('Error in onFailure handler:', error);\n }\n }\n return this;\n }\n \n /**\n * 无论成功失败,都执行函数\n * @param fn 要执行的函数\n */\n onFinally(fn: () => void): Result<T> {\n try {\n fn();\n } catch (error) {\n console.error('Error in onFinally handler:', error);\n }\n return this;\n }\n \n /**\n * 转换为字符串\n */\n toString(): string {\n if (this.isSuccess()) {\n return `Success: ${JSON.stringify(this._data)}`;\n } else {\n return `Failure: ${this._error?.message || 'Unknown error'}`;\n }\n }\n} ","/**\n * @file 身份证模块类型定义\n * @description 身份证模块相关的类型和接口定义\n * @module modules/id-card/types\n */\n\n/**\n * 身份证类型枚举\n */\nexport enum IDCardType {\n /** 第二代居民身份证正面 */\n FRONT = 'front',\n /** 第二代居民身份证背面 */\n BACK = 'back',\n /** 第一代居民身份证 */\n FIRST_GENERATION = 'first_generation',\n /** 临时身份证 */\n TEMPORARY = 'temporary',\n /** 外国人永久居留证 */\n FOREIGN_PERMANENT = 'foreign_permanent',\n /** 港澳台居民居住证 */\n HMT_RESIDENT = 'hmt_resident',\n /** 未知类型 */\n UNKNOWN = 'unknown'\n}\n\n/**\n * 证件边缘信息\n */\nexport interface IDCardEdge {\n /** 左上角坐标 */\n topLeft: { x: number; y: number };\n /** 右上角坐标 */\n topRight: { x: number; y: number };\n /** 右下角坐标 */\n bottomRight: { x: number; y: number };\n /** 左下角坐标 */\n bottomLeft: { x: number; y: number };\n}\n\n/**\n * 身份证信息\n */\nexport interface IDCardInfo {\n nationality?: string;\n issuingAuthority?: string;\n validPeriod?: string;\n /** 身份证类型 */\n type?: IDCardType;\n /** 身份证边缘信息 */\n edge?: IDCardEdge;\n /** 姓名 */\n name?: string;\n /** 性别 */\n gender?: string;\n /** 民族 */\n ethnicity?: string;\n /** 出生日期,格式: YYYY-MM-DD */\n birthDate?: string;\n /** 地址 */\n address?: string;\n /** 身份证号码 */\n idNumber?: string;\n /** 签发机关 */\n issueAuthority?: string;\n /** 有效期起始日期,格式: YYYY-MM-DD */\n validFrom?: string;\n /** 有效期截止日期,格式: YYYY-MM-DD */\n validTo?: string;\n /** 相片区域坐标 */\n photoRegion?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n /** 原始身份证图像 */\n image?: ImageData;\n /** 置信度 */\n confidence?: number;\n /** 防伪检测结果 */\n antiFake?: {\n /** 是否通过防伪检测 */\n passed: boolean;\n /** 防伪检测分数 */\n score: number;\n /** 防伪特征检测结果 */\n features?: {\n /** 荧光油墨 */\n fluorescent?: boolean;\n /** 微缩文字 */\n microtext?: boolean;\n /** 光变图案 */\n opticalVariable?: boolean;\n /** 纹理 */\n texture?: boolean;\n /** 暗记 */\n watermark?: boolean;\n };\n };\n}\n\n/**\n * 身份证模块配置选项\n */\nexport interface IDCardModuleOptions {\n /** 是否启用模块 */\n enabled?: boolean;\n \n /** 检测器配置 */\n detector?: {\n /** 最小置信度 */\n minConfidence?: number;\n /** 是否启用OCR识别 */\n enableOCR?: boolean;\n /** 是否启用防伪检测 */\n enableAntiFake?: boolean;\n };\n \n /** OCR处理器配置 */\n ocr?: {\n /** 是否使用Web Worker处理OCR */\n useWorker?: boolean;\n /** 最大图像尺寸 */\n maxImageDimension?: number;\n /** 亮度调整 */\n brightness?: number;\n /** 对比度调整 */\n contrast?: number;\n };\n \n /** 防伪检测配置 */\n antiFake?: {\n /** 防伪检测灵敏度 */\n sensitivity?: number;\n /** 最小置信度 */\n minConfidence?: number;\n };\n}\n\n/**\n * 身份证验证结果\n */\nexport interface IDCardVerificationResult {\n /** 是否验证通过 */\n isValid: boolean;\n /** 验证分数 */\n score: number;\n /** 失败原因 */\n failureReason?: string;\n /** 验证详情 */\n details?: {\n /** 身份证号码是否有效 */\n idNumberValid?: boolean;\n /** 签发日期是否有效 */\n issueDateValid?: boolean;\n /** 有效期是否过期 */\n isExpired?: boolean;\n /** 防伪检测是否通过 */\n antiFakePassed?: boolean;\n };\n}\n\n/**\n * 图像处理配置选项\n */\nexport interface ImageProcessOptions {\n /** 是否进行预处理 */\n preprocess?: boolean;\n /** 是否校正图像 */\n correctPerspective?: boolean;\n /** 是否增强图像 */\n enhance?: boolean;\n /** 是否去噪 */\n denoise?: boolean;\n /** 是否二值化 */\n binarize?: boolean;\n} ","/**\n * @file 身份证检测器\n * @description 提供身份证检测和解析功能\n * @module modules/id-card/id-card-detector\n */\n\nimport { EventEmitter } from '../../core/event-emitter';\nimport { Logger } from '../../core/logger';\nimport { Result } from '../../core/result';\nimport { IDCardType, IDCardEdge, IDCardInfo } from './types';\n\n/**\n * 身份证检测器配置选项\n */\nexport interface IDCardDetectorOptions {\n /** 是否启用 */\n enabled?: boolean;\n /** 最小置信度 */\n minConfidence?: number;\n /** 是否检测身份证类型 */\n detectType?: boolean;\n /** 是否检测边缘 */\n detectEdge?: boolean;\n /** 是否启用边缘检测(用于更精确的边缘检测) */\n enableEdgeDetection?: boolean;\n /** 是否启用OCR识别 */\n enableOCR?: boolean;\n /** 是否裁剪并校正图像 */\n cropAndAlign?: boolean;\n /** 是否启用防伪检测 */\n enableAntiFake?: boolean;\n /** 是否返回原始图像 */\n returnImage?: boolean;\n /** 模型路径 */\n modelPath?: string;\n}\n\n/**\n * 图像处理配置选项\n */\nexport interface ImageProcessOptions {\n /** 是否进行预处理 */\n preprocess?: boolean;\n /** 是否校正图像 */\n correctPerspective?: boolean;\n /** 是否增强图像 */\n enhance?: boolean;\n /** 是否去噪 */\n denoise?: boolean;\n /** 是否二值化 */\n binarize?: boolean;\n}\n\n/**\n * 身份证检测器类\n */\nexport class IDCardDetector extends EventEmitter {\n private options: IDCardDetectorOptions;\n private logger: Logger;\n private initialized: boolean = false;\n private models: {\n detection?: any;\n ocr?: any;\n antiFake?: any;\n } = {};\n \n /** 重用的 Canvas 元素,用于减少内存分配 */\n private reusableCanvas: HTMLCanvasElement | null = null;\n private reusableContext: CanvasRenderingContext2D | null = null;\n\n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(options: IDCardDetectorOptions = {}) {\n super();\n this.options = {\n enabled: true,\n minConfidence: 0.7,\n detectType: true,\n detectEdge: true,\n enableEdgeDetection: false,\n enableOCR: true,\n cropAndAlign: true,\n enableAntiFake: false,\n returnImage: false,\n modelPath: '/models/id-card',\n ...options\n };\n this.logger = Logger.getInstance();\n }\n\n /**\n * 初始化检测器\n */\n public async initialize(): Promise<void> {\n if (this.initialized || !this.options.enabled) {\n return;\n }\n\n this.logger.debug('IDCardDetector', '初始化身份证检测器');\n \n try {\n // 加载检测模型\n await this.loadDetectionModel();\n \n // 如果启用OCR,加载OCR模型\n if (this.options.enableOCR) {\n await this.loadOCRModel();\n }\n \n // 如果启用防伪检测,加载防伪模型\n if (this.options.enableAntiFake) {\n await this.loadAntiFakeModel();\n }\n \n this.initialized = true;\n this.emit('detector:initialized', {});\n this.logger.debug('IDCardDetector', '身份证检测器初始化完成');\n } catch (error) {\n this.logger.error('IDCardDetector', '身份证检测器初始化失败', error as Error);\n throw error;\n }\n }\n\n /**\n * 加载检测模型\n * @private\n */\n private async loadDetectionModel(): Promise<void> {\n // 实际项目中,这里应该加载检测模型\n this.logger.debug('IDCardDetector', '加载身份证检测模型');\n \n // 模拟加载模型的延迟\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 设置模型\n this.models.detection = {\n loaded: true,\n name: 'id-card-detection'\n };\n }\n\n /**\n * 加载OCR模型\n * @private\n */\n private async loadOCRModel(): Promise<void> {\n // 实际项目中,这里应该加载OCR模型\n this.logger.debug('IDCardDetector', '加载身份证OCR模型');\n \n // 模拟加载模型的延迟\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 设置模型\n this.models.ocr = {\n loaded: true,\n name: 'id-card-ocr'\n };\n }\n\n /**\n * 加载防伪模型\n * @private\n */\n private async loadAntiFakeModel(): Promise<void> {\n // 实际项目中,这里应该加载防伪模型\n this.logger.debug('IDCardDetector', '加载身份证防伪模型');\n \n // 模拟加载模型的延迟\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // 设置模型\n this.models.antiFake = {\n loaded: true,\n name: 'id-card-anti-fake'\n };\n }\n\n /**\n * 处理图像\n * @param image 图像源(可以是ImageData、HTMLImageElement、HTMLCanvasElement等)\n * @param processOptions 图像处理选项\n * @returns 处理结果\n */\n public async processImage(\n image: ImageData | HTMLImageElement | HTMLCanvasElement,\n processOptions: ImageProcessOptions = {}\n ): Promise<Result<IDCardInfo>> {\n if (!this.initialized) {\n return Result.failure(new Error('身份证检测器未初始化'));\n }\n\n // 输入验证\n if (!image) {\n return Result.failure(new Error('图像源不能为空'));\n }\n\n // 验证 HTMLImageElement 是否已加载\n if (image instanceof HTMLImageElement && !image.complete) {\n return Result.failure(new Error('图像尚未加载完成'));\n }\n\n // 验证 ImageData 尺寸\n if (image instanceof ImageData) {\n if (image.width === 0 || image.height === 0) {\n return Result.failure(new Error('图像尺寸无效'));\n }\n }\n\n // 验证 Canvas 尺寸\n if (image instanceof HTMLCanvasElement) {\n if (image.width === 0 || image.height === 0) {\n return Result.failure(new Error('Canvas尺寸无效'));\n }\n }\n\n try {\n this.logger.debug('IDCardDetector', '开始处理图像');\n \n // 预处理图像\n const processedImage = await this.preprocessImage(image, processOptions);\n \n // 检测身份证\n const detectionResult = await this.detectIDCard(processedImage);\n \n if (!detectionResult || detectionResult.confidence < (this.options.minConfidence || 0.7)) {\n return Result.failure(new Error('未检测到身份证或置信度过低'));\n }\n \n let idCardInfo: IDCardInfo = {\n type: detectionResult.type,\n edge: detectionResult.edge,\n confidence: detectionResult.confidence\n };\n \n // 如果启用OCR识别,提取文字信息\n if (this.options.enableOCR && this.models.ocr) {\n // 裁剪并校正图像\n const alignedImage = this.options.cropAndAlign ? \n await this.cropAndAlign(processedImage, detectionResult.edge) : \n processedImage;\n \n // 识别文字\n const ocrResult = await this.recognizeText(alignedImage, detectionResult.type);\n \n // 合并结果\n idCardInfo = {\n ...idCardInfo,\n ...ocrResult\n };\n }\n \n // 如果启用防伪检测,进行防伪检测\n if (this.options.enableAntiFake && this.models.antiFake) {\n const antiFakeResult = await this.detectAntiFake(processedImage, detectionResult);\n idCardInfo.antiFake = antiFakeResult;\n }\n \n // 如果需要返回原始图像\n if (this.options.returnImage) {\n // 根据图像类型获取ImageData\n if (image instanceof ImageData) {\n idCardInfo.image = image;\n } else if (image instanceof HTMLCanvasElement) {\n const context = image.getContext('2d');\n if (context) {\n idCardInfo.image = context.getImageData(0, 0, image.width, image.height);\n }\n } else if (image instanceof HTMLImageElement && image.complete) {\n const canvas = this.getReusableCanvas(image.naturalWidth, image.naturalHeight);\n const context = canvas.getContext('2d');\n if (context) {\n context.drawImage(image, 0, 0);\n idCardInfo.image = context.getImageData(0, 0, canvas.width, canvas.height);\n }\n }\n }\n \n this.logger.debug('IDCardDetector', '图像处理完成');\n this.emit('detector:result', { result: idCardInfo });\n \n return Result.success(idCardInfo);\n } catch (error) {\n this.logger.error('IDCardDetector', '图像处理失败', error as Error);\n return Result.failure(error as Error);\n }\n }\n\n /**\n * 获取可重用的 Canvas 元素\n * @param width 宽度\n * @param height 高度\n * @returns CanvasRenderingContext2D\n */\n private getReusableCanvas(width: number, height: number): HTMLCanvasElement {\n // 如果存在可重用的 canvas 且尺寸匹配,直接返回\n if (this.reusableCanvas && \n this.reusableCanvas.width === width && \n this.reusableCanvas.height === height) {\n return this.reusableCanvas;\n }\n \n // 创建新的 canvas\n this.reusableCanvas = document.createElement('canvas');\n this.reusableCanvas.width = width;\n this.reusableCanvas.height = height;\n this.reusableContext = this.reusableCanvas.getContext('2d');\n \n return this.reusableCanvas;\n }\n\n /**\n * 预处理图像\n * @param image 图像源\n * @param options 处理选项\n * @returns 处理后的图像\n * @private\n */\n private async preprocessImage(\n image: ImageData | HTMLImageElement | HTMLCanvasElement,\n options: ImageProcessOptions\n ): Promise<ImageData> {\n this.logger.debug('IDCardDetector', '预处理图像');\n \n // 创建ImageData对象\n let imageData: ImageData;\n \n if (image instanceof ImageData) {\n imageData = image;\n } else {\n const width = image instanceof HTMLImageElement ? image.naturalWidth : image.width;\n const height = image instanceof HTMLImageElement ? image.naturalHeight : image.height;\n \n const canvas = this.getReusableCanvas(width, height);\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('无法获取Canvas上下文');\n }\n \n if (image instanceof HTMLImageElement) {\n context.drawImage(image, 0, 0);\n } else {\n context.drawImage(image, 0, 0);\n }\n \n imageData = context.getImageData(0, 0, width, height);\n }\n \n // 应用图像处理选项\n // 实际项目中,这里应该根据options进行相应的图像处理\n \n return imageData;\n }\n\n /**\n * 检测身份证\n * @param image 图像数据\n * @returns 检测结果\n * @private\n */\n private async detectIDCard(image: ImageData): Promise<{\n type: IDCardType;\n edge: IDCardEdge;\n confidence: number;\n } | null> {\n // 实际项目中,这里应该调用模型进行身份证检测\n this.logger.debug('IDCardDetector', '检测身份证');\n \n // 模拟检测结果\n // 在实际应用中,这里应该使用机器学习模型进行推理\n return {\n type: IDCardType.FRONT,\n edge: {\n topLeft: { x: 10, y: 10 },\n topRight: { x: image.width - 10, y: 10 },\n bottomRight: { x: image.width - 10, y: image.height - 10 },\n bottomLeft: { x: 10, y: image.height - 10 }\n },\n confidence: 0.95\n };\n }\n\n /**\n * 裁剪并校正图像\n * @param image 图像数据\n * @param edge 边缘信息\n * @returns 校正后的图像\n * @private\n */\n private async cropAndAlign(image: ImageData, edge: IDCardEdge): Promise<ImageData> {\n this.logger.debug('IDCardDetector', '裁剪并校正图像');\n \n // 设置标准身份证尺寸比例\n const standardWidth = 428;\n const standardHeight = 270;\n \n const canvas = this.getReusableCanvas(standardWidth, standardHeight);\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('无法获取Canvas上下文');\n }\n \n // 创建临时Canvas用于源图像\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = image.width;\n tempCanvas.height = image.height;\n \n const tempContext = tempCanvas.getContext('2d');\n if (!tempContext) {\n throw new Error('无法获取临时Canvas上下文');\n }\n \n // 将ImageData绘制到临时Canvas\n tempContext.putImageData(image, 0, 0);\n \n // 在实际应用中,这里应该使用透视变换算法\n // 例如使用Canvas的transform或WebGL进行变换\n \n // 简化处理:直接裁剪\n context.drawImage(\n tempCanvas,\n edge.topLeft.x,\n edge.topLeft.y,\n edge.topRight.x - edge.topLeft.x,\n edge.bottomLeft.y - edge.topLeft.y,\n 0,\n 0,\n standardWidth,\n standardHeight\n );\n \n return context.getImageData(0, 0, standardWidth, standardHeight);\n }\n\n /**\n * 识别文字\n * \n * @note 此方法返回模拟数据,用于框架开发和测试\n * 实际使用时需要替换为真实的 OCR 模型集成\n * \n * @param image 图像数据\n * @param type 身份证类型\n * @returns 识别结果\n * @private\n */\n private async recognizeText(image: ImageData, type: IDCardType): Promise<Partial<IDCardInfo>> {\n this.logger.debug('IDCardDetector', '识别文字');\n \n // 模拟OCR结果\n // 注意:这是框架的占位实现,真实场景需要接入实际的 OCR 服务\n // 可选的方案包括:\n // - TensorFlow.js + 自定义 OCR 模型\n // - 第三方 OCR API (如百度OCR、腾讯OCR)\n // - Tesseract.js WASM 版本\n // \n if (type === IDCardType.FRONT) {\n return {\n name: '张三', // TODO: 替换为真实OCR结果\n gender: '男', // TODO: 替换为真实OCR结果\n ethnicity: '汉', // TODO: 替换为真实OCR结果\n birthDate: '1990-01-01', // TODO: 替换为真实OCR结果\n address: '北京市朝阳区某某街道某某社区1号楼1单元101', // TODO: 替换为真实OCR结果\n idNumber: '110101199001010001', // TODO: 替换为真实OCR结果\n photoRegion: {\n x: 300,\n y: 40,\n width: 100,\n height: 130\n }\n };\n } else if (type === IDCardType.BACK) {\n return {\n issueAuthority: '北京市公安局朝阳分局', // TODO: 替换为真实OCR结果\n validFrom: '2015-01-01', // TODO: 替换为真实OCR结果\n validTo: '2035-01-01' // TODO: 替换为真实OCR结果\n };\n }\n \n return {};\n }\n\n /**\n * 检测防伪特征\n * \n * @note 此方法返回模拟数据,用于框架开发和测试\n * 实际使用时需要替换为真实的防伪检测模型\n * \n * @param image 图像数据\n * @param detectionResult 检测结果\n * @returns 防伪检测结果\n * @private\n */\n private async detectAntiFake(\n image: ImageData,\n detectionResult: { type: IDCardType; edge: IDCardEdge; confidence: number }\n ): Promise<IDCardInfo['antiFake']> {\n this.logger.debug('IDCardDetector', '检测防伪特征');\n \n // 模拟防伪检测结果\n // 注意:这是框架的占位实现,真实场景需要接入实际的防伪检测模型\n // 可选的方案包括:\n // - 紫外光特征检测\n // - 红外光特征检测\n // - 微缩文字检测\n // - 光学变色特征检测\n return {\n passed: true,\n score: 0.92,\n features: {\n fluorescent: true, // TODO: 替换为真实检测结果\n microtext: true, // TODO: 替换为真实检测结果\n opticalVariable: true, // TODO: 替换为真实检测结果\n texture: true, // TODO: 替换为真实检测结果\n watermark: true // TODO: 替换为真实检测结果\n }\n };\n }\n\n /**\n * 释放资源\n */\n public dispose(): void {\n this.logger.debug('IDCardDetector', '释放资源');\n \n // 清理模型\n this.models = {};\n this.initialized = false;\n \n // 清理可重用的 Canvas\n this.reusableCanvas = null;\n this.reusableContext = null;\n \n // 清理事件监听\n this.removeAllListeners();\n }\n} ","/**\n * @file 图像处理工具类\n * @description 提供图像预处理功能,用于提高OCR识别率\n * @module ImageProcessor\n * @version 1.3.2\n */\n\nimport imageCompression from \"browser-image-compression\"\nimport { Point, Rect, ImageProcessingOptions } from './types';\n\n/**\n * 图像处理器配置选项\n */\nexport interface ImageProcessorOptions {\n brightness?: number // 亮度调整,范围 -100 到 100\n contrast?: number // 对比度调整,范围 -100 到 100\n grayscale?: boolean // 是否转换为灰度图\n invert?: boolean // 是否反转颜色\n blur?: number // 模糊程度 (0-10)\n sharpen?: boolean // 是否锐化\n}\n\n/**\n * 图像压缩选项\n */\nexport interface ImageCompressionOptions {\n maxSizeMB?: number // 图片最大大小,MB\n maxWidthOrHeight?: number // 图片最大宽度或高度\n useWebWorker?: boolean // 是否使用Web Worker处理\n maxIteration?: number // 最大压缩迭代次数\n quality?: number // 输出质量 (0-1)\n fileType?: string // 输出文件类型 ('image/jpeg', 'image/png' 等)\n}\n\n/**\n * 图像处理工具类\n *\n * 提供各种图像处理功能,用于优化识别效果\n */\nexport class ImageProcessor {\n /**\n * 将ImageData转换为Canvas元素\n *\n * @param {ImageData} imageData - 要转换的图像数据\n * @returns {HTMLCanvasElement} 包含图像的Canvas元素\n */\n static imageDataToCanvas(imageData: ImageData): HTMLCanvasElement {\n const canvas = document.createElement(\"canvas\")\n canvas.width = imageData.width\n canvas.height = imageData.height\n const ctx = canvas.getContext(\"2d\")\n\n if (ctx) {\n ctx.putImageData(imageData, 0, 0)\n }\n\n return canvas\n }\n\n /**\n * 将Canvas转换为ImageData\n *\n * @param {HTMLCanvasElement} canvas - 要转换的Canvas元素\n * @returns {ImageData|null} Canvas的图像数据,如果获取失败则返回null\n */\n static canvasToImageData(canvas: HTMLCanvasElement): ImageData | null {\n const ctx = canvas.getContext(\"2d\")\n return ctx ? ctx.getImageData(0, 0, canvas.width, canvas.height) : null\n }\n\n /**\n * 调整图像亮度和对比度\n *\n * @param imageData 原始图像数据\n * @param brightness 亮度调整值 (-100到100)\n * @param contrast 对比度调整值 (-100到100)\n * @returns 处理后的图像数据\n */\n static adjustBrightnessContrast(\n imageData: ImageData,\n brightness: number = 0,\n contrast: number = 0\n ): ImageData {\n // 将亮度和对比度范围限制在 -100 到 100 之间\n brightness = Math.max(-100, Math.min(100, brightness))\n contrast = Math.max(-100, Math.min(100, contrast))\n\n // 将范围转换为适合计算的值\n const factor = (259 * (contrast + 255)) / (255 * (259 - contrast))\n const briAdjust = (brightness / 100) * 255\n\n const data = imageData.data\n const length = data.length\n\n for (let i = 0; i < length; i += 4) {\n // 分别处理 RGB 三个通道\n for (let j = 0; j < 3; j++) {\n // 应用亮度和对比度调整公式\n const newValue = factor * (data[i + j] + briAdjust - 128) + 128\n data[i + j] = Math.max(0, Math.min(255, newValue))\n }\n // Alpha 通道保持不变\n }\n\n return imageData\n }\n\n /**\n * 将图像转换为灰度图\n *\n * @param imageData 原始图像数据\n * @returns 灰度图像数据\n */\n static toGrayscale(imageData: ImageData): ImageData {\n const data = imageData.data\n const length = data.length\n\n for (let i = 0; i < length; i += 4) {\n // 使用加权平均法将 RGB 转换为灰度值\n const gray = data[i] * 0.3 + data[i + 1] * 0.59 + data[i + 2] * 0.11\n data[i] = data[i + 1] = data[i + 2] = gray\n }\n\n return imageData\n }\n\n /**\n * 锐化图像\n *\n * @param imageData 原始图像数据\n * @param amount 锐化程度,默认为2\n * @returns 锐化后的图像数据\n */\n static sharpen(imageData: ImageData, amount: number = 2): ImageData {\n if (!imageData || !imageData.data) return imageData\n\n const width = imageData.width\n const height = imageData.height\n const data = imageData.data\n\n const outputData = new Uint8ClampedArray(data.length)\n\n // 锐化卷积核\n const kernel = [\n 0,\n -amount,\n 0,\n -amount,\n 1 + 4 * amount,\n -amount,\n 0,\n -amount,\n 0,\n ]\n\n // 应用卷积\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n const pos = (y * width + x) * 4\n\n // 对每个通道应用卷积\n for (let c = 0; c < 3; c++) {\n let val = 0\n for (let ky = -1; ky <= 1; ky++) {\n for (let kx = -1; kx <= 1; kx++) {\n const kernelPos = (ky + 1) * 3 + (kx + 1)\n const dataPos = ((y + ky) * width + (x + kx)) * 4 + c\n val += data[dataPos] * kernel[kernelPos]\n }\n }\n outputData[pos + c] = Math.max(0, Math.min(255, val))\n }\n outputData[pos + 3] = data[pos + 3] // 保持透明度不变\n }\n }\n\n // 处理边缘像素\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n if (y === 0 || y === height - 1 || x === 0 || x === width - 1) {\n const pos = (y * width + x) * 4\n outputData[pos] = data[pos]\n outputData[pos + 1] = data[pos + 1]\n outputData[pos + 2] = data[pos + 2]\n outputData[pos + 3] = data[pos + 3]\n }\n }\n }\n\n // 创建新的ImageData对象\n return new ImageData(outputData, width, height)\n }\n\n /**\n * 对图像应用阈值操作,增强对比度\n *\n * @param imageData 原始图像数据\n * @param threshold 阈值 (0-255)\n * @returns 处理后的图像数据\n */\n static threshold(imageData: ImageData, threshold: number = 128): ImageData {\n // 先转换为灰度图\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n )\n\n const data = grayscaleImage.data\n const length = data.length\n\n for (let i = 0; i < length; i += 4) {\n // 二值化处理\n const value = data[i] < threshold ? 0 : 255\n data[i] = data[i + 1] = data[i + 2] = value\n }\n\n return grayscaleImage\n }\n\n /**\n * 将图像转换为黑白图像(二值化)\n *\n * @param imageData 原始图像数据\n * @returns 二值化后的图像数据\n */\n static toBinaryImage(imageData: ImageData): ImageData {\n // 先转换为灰度图\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n )\n\n // 使用OTSU算法自动确定阈值\n const threshold = this.getOtsuThreshold(grayscaleImage)\n\n return this.threshold(grayscaleImage, threshold)\n }\n\n /**\n * 使用OTSU算法计算最佳阈值\n *\n * @param imageData 灰度图像数据\n * @returns 最佳阈值\n */\n private static getOtsuThreshold(imageData: ImageData): number {\n const data = imageData.data\n const histogram = new Array(256).fill(0)\n\n // 统计灰度直方图\n for (let i = 0; i < data.length; i += 4) {\n histogram[data[i]]++\n }\n\n const total = imageData.width * imageData.height\n let sum = 0\n\n // 计算总灰度值和\n for (let i = 0; i < 256; i++) {\n sum += i * histogram[i]\n }\n\n let sumB = 0\n let wB = 0\n let wF = 0\n let maxVariance = 0\n let threshold = 0\n\n // 遍历所有可能的阈值,找到最大类间方差\n for (let t = 0; t < 256; t++) {\n wB += histogram[t] // 背景权重\n if (wB === 0) continue\n\n wF = total - wB // 前景权重\n if (wF === 0) break\n\n sumB += t * histogram[t]\n\n const mB = sumB / wB // 背景平均灰度\n const mF = (sum - sumB) / wF // 前景平均灰度\n\n // 计算类间方差\n const variance = wB * wF * (mB - mF) * (mB - mF)\n\n if (variance > maxVariance) {\n maxVariance = variance\n threshold = t\n }\n }\n\n return threshold\n }\n\n /**\n * 批量应用图像处理\n *\n * @param imageData 原始图像数据\n * @param options 处理选项\n * @returns 处理后的图像数据\n */\n static batchProcess(\n imageData: ImageData,\n options: ImageProcessorOptions\n ): ImageData {\n let processedImage = new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n\n // 应用亮度和对比度调整\n if (options.brightness !== undefined || options.contrast !== undefined) {\n processedImage = this.adjustBrightnessContrast(\n processedImage,\n options.brightness || 0,\n options.contrast || 0\n )\n }\n\n // 应用灰度转换\n if (options.grayscale) {\n processedImage = this.toGrayscale(processedImage)\n }\n\n // 应用锐化\n if (options.sharpen) {\n processedImage = this.sharpen(processedImage)\n }\n\n // 应用颜色反转\n if (options.invert) {\n const data = processedImage.data\n for (let i = 0; i < data.length; i += 4) {\n // 反转RGB值\n data[i] = 255 - data[i]\n data[i + 1] = 255 - data[i + 1]\n data[i + 2] = 255 - data[i + 2]\n // Alpha通道保持不变\n }\n }\n\n return processedImage\n }\n\n /**\n * 压缩图片文件\n *\n * @param file 图片文件\n * @param options 压缩选项\n * @returns Promise<File> 压缩后的文件\n */\n static async compressImage(\n file: File,\n options?: ImageCompressionOptions\n ): Promise<File> {\n const defaultOptions = {\n maxSizeMB: 1,\n maxWidthOrHeight: 1920,\n useWebWorker: true,\n quality: 0.8,\n fileType: file.type || \"image/jpeg\",\n }\n\n const compressOptions = { ...defaultOptions, ...options }\n\n try {\n return await imageCompression(file, compressOptions)\n } catch (error) {\n console.error(\"图片压缩失败:\", error)\n return file // 如果压缩失败,返回原始文件\n }\n }\n\n /**\n * 从图片文件创建ImageData\n *\n * @param file 图片文件\n * @returns Promise<ImageData>\n */\n static async createImageDataFromFile(file: File): Promise<ImageData> {\n return new Promise((resolve, reject) => {\n try {\n const img = new Image()\n const url = URL.createObjectURL(file)\n\n img.onload = () => {\n try {\n // 创建canvas元素\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")\n\n if (!ctx) {\n reject(new Error(\"无法创建2D上下文\"))\n return\n }\n\n canvas.width = img.width\n canvas.height = img.height\n\n // 绘制图片到canvas\n ctx.drawImage(img, 0, 0)\n\n // 获取图像数据\n const imageData = ctx.getImageData(\n 0,\n 0,\n canvas.width,\n canvas.height\n )\n\n // 释放资源\n URL.revokeObjectURL(url)\n\n resolve(imageData)\n } catch (e) {\n reject(e)\n }\n }\n\n img.onerror = () => {\n URL.revokeObjectURL(url)\n reject(new Error(\"图片加载失败\"))\n }\n\n img.src = url\n } catch (error) {\n reject(error)\n }\n })\n }\n\n /**\n * 将ImageData转换为File对象\n *\n * @param imageData ImageData对象\n * @param fileName 输出文件名\n * @param fileType 输出文件类型\n * @param quality 图片质量 (0-1)\n * @returns Promise<File>\n */\n static async imageDataToFile(\n imageData: ImageData,\n fileName: string = \"image.jpg\",\n fileType: string = \"image/jpeg\",\n quality: number = 0.8\n ): Promise<File> {\n return new Promise((resolve, reject) => {\n try {\n const canvas = document.createElement(\"canvas\")\n canvas.width = imageData.width\n canvas.height = imageData.height\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) {\n reject(new Error(\"无法创建2D上下文\"))\n return\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"无法创建图片Blob\"))\n return\n }\n const file = new File([blob], fileName, { type: fileType })\n resolve(file)\n },\n fileType,\n quality\n )\n } catch (error) {\n reject(error)\n }\n })\n }\n\n /**\n * 将图像调整到指定大小\n * @param image 输入图像\n * @param maxWidth 最大宽度\n * @param maxHeight 最大高度\n * @param keepAspectRatio 是否保持宽高比\n * @returns 调整后的图像\n */\n public static resizeImage(\n image: ImageData | HTMLImageElement | HTMLCanvasElement,\n maxWidth: number,\n maxHeight: number,\n keepAspectRatio: boolean = true\n ): ImageData {\n // 创建canvas元素\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) {\n throw new Error('无法创建Canvas上下文');\n }\n \n // 获取图像尺寸\n let width: number;\n let height: number;\n \n if (image instanceof ImageData) {\n width = image.width;\n height = image.height;\n } else {\n width = image.width;\n height = image.height;\n }\n \n // 计算调整后的尺寸\n let newWidth = width;\n let newHeight = height;\n \n if (keepAspectRatio) {\n if (width > height) {\n if (width > maxWidth) {\n newHeight = Math.round(height * (maxWidth / width));\n newWidth = maxWidth;\n }\n } else {\n if (height > maxHeight) {\n newWidth = Math.round(width * (maxHeight / height));\n newHeight = maxHeight;\n }\n }\n } else {\n newWidth = Math.min(width, maxWidth);\n newHeight = Math.min(height, maxHeight);\n }\n \n // 设置canvas尺寸\n canvas.width = newWidth;\n canvas.height = newHeight;\n \n // 绘制调整后的图像\n if (image instanceof ImageData) {\n // 创建临时canvas存储ImageData\n const tempCanvas = document.createElement('canvas');\n const tempCtx = tempCanvas.getContext('2d');\n \n if (!tempCtx) {\n throw new Error('无法创建临时Canvas上下文');\n }\n\n tempCanvas.width = image.width;\n tempCanvas.height = image.height;\n tempCtx.putImageData(image, 0, 0);\n \n // 绘制调整后的图像\n ctx.drawImage(tempCanvas, 0, 0, width, height, 0, 0, newWidth, newHeight);\n } else {\n ctx.drawImage(image, 0, 0, width, height, 0, 0, newWidth, newHeight);\n }\n\n // 返回调整后的ImageData\n return ctx.getImageData(0, 0, newWidth, newHeight);\n }\n \n /**\n * 边缘检测算法,用于识别图像中的边缘\n * 基于Sobel算子实现\n * \n * @param imageData 原始图像数据,应已转为灰度图\n * @param threshold 边缘阈值,默认为30\n * @returns 检测到边缘的图像数据\n */\n static detectEdges(imageData: ImageData, threshold: number = 30): ImageData {\n // 确保输入图像是灰度图\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n );\n \n const width = grayscaleImage.width;\n const height = grayscaleImage.height;\n const inputData = grayscaleImage.data;\n const outputData = new Uint8ClampedArray(inputData.length);\n \n // Sobel算子 - 水平和垂直方向\n const sobelX = [-1, 0, 1, -2, 0, 2, -1, 0, 1];\n const sobelY = [-1, -2, -1, 0, 0, 0, 1, 2, 1];\n \n // 对每个像素应用Sobel算子\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n let gx = 0;\n let gy = 0;\n \n // 应用卷积\n for (let ky = -1; ky <= 1; ky++) {\n for (let kx = -1; kx <= 1; kx++) {\n const pixelPos = ((y + ky) * width + (x + kx)) * 4;\n const pixelVal = inputData[pixelPos]; // 灰度值\n \n const kernelIdx = (ky + 1) * 3 + (kx + 1);\n gx += pixelVal * sobelX[kernelIdx];\n gy += pixelVal * sobelY[kernelIdx];\n }\n }\n \n // 计算梯度强度\n let magnitude = Math.sqrt(gx * gx + gy * gy);\n \n // 应用阈值\n magnitude = magnitude > threshold ? 255 : 0;\n \n // 设置输出像素\n const pos = (y * width + x) * 4;\n outputData[pos] = outputData[pos + 1] = outputData[pos + 2] = magnitude;\n outputData[pos + 3] = 255; // 透明度保持完全不透明\n }\n }\n \n // 处理边缘像素\n for (let i = 0; i < width * 4; i++) {\n // 顶部和底部行\n outputData[i] = 0;\n outputData[(height - 1) * width * 4 + i] = 0;\n }\n \n for (let i = 0; i < height; i++) {\n // 左右两侧列\n const leftPos = i * width * 4;\n const rightPos = (i * width + width - 1) * 4;\n \n for (let j = 0; j < 4; j++) {\n outputData[leftPos + j] = 0;\n outputData[rightPos + j] = 0;\n }\n }\n \n return new ImageData(outputData, width, height);\n }\n \n /**\n * 卡尼-德里奇边缘检测\n * 相比Sobel更精确的边缘检测算法\n * \n * @param imageData 灰度图像数据\n * @param lowThreshold 低阈值\n * @param highThreshold 高阈值\n * @returns 边缘检测结果\n */\n static cannyEdgeDetection(\n imageData: ImageData, \n lowThreshold: number = 20, \n highThreshold: number = 50\n ): ImageData {\n const grayscaleImage = this.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n );\n \n // 1. 高斯模糊\n const blurredImage = this.gaussianBlur(grayscaleImage, 1.5);\n \n // 2. 使用Sobel算子计算梯度\n const { gradientMagnitude, gradientDirection } = this.computeGradients(blurredImage);\n \n // 3. 非极大值抛弃\n const nonMaxSuppressed = this.nonMaxSuppression(gradientMagnitude, gradientDirection, blurredImage.width, blurredImage.height);\n \n // 4. 双阈值处理\n const thresholdResult = this.hysteresisThresholding(\n nonMaxSuppressed, \n blurredImage.width, \n blurredImage.height, \n lowThreshold, \n highThreshold\n );\n \n // 创建输出图像\n const outputData = new Uint8ClampedArray(imageData.data.length);\n \n // 将结果转换为ImageData\n for (let i = 0; i < thresholdResult.length; i++) {\n const pos = i * 4;\n const value = thresholdResult[i] ? 255 : 0;\n outputData[pos] = outputData[pos + 1] = outputData[pos + 2] = value;\n outputData[pos + 3] = 255;\n }\n \n return new ImageData(outputData, blurredImage.width, blurredImage.height);\n }\n \n /**\n * 高斯模糊\n */\n private static gaussianBlur(imageData: ImageData, sigma: number = 1.5): ImageData {\n const width = imageData.width;\n const height = imageData.height;\n const inputData = imageData.data;\n const outputData = new Uint8ClampedArray(inputData.length);\n \n // 生成高斯核\n const kernelSize = Math.max(3, Math.floor(sigma * 3) * 2 + 1);\n const halfKernel = Math.floor(kernelSize / 2);\n const kernel = this.generateGaussianKernel(kernelSize, sigma);\n \n // 应用高斯核\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n let sum = 0;\n let weightSum = 0;\n \n for (let ky = -halfKernel; ky <= halfKernel; ky++) {\n for (let kx = -halfKernel; kx <= halfKernel; kx++) {\n const pixelY = Math.min(Math.max(y + ky, 0), height - 1);\n const pixelX = Math.min(Math.max(x + kx, 0), width - 1);\n const pixelPos = (pixelY * width + pixelX) * 4;\n \n const kernelY = ky + halfKernel;\n const kernelX = kx + halfKernel;\n const weight = kernel[kernelY * kernelSize + kernelX];\n \n sum += inputData[pixelPos] * weight;\n weightSum += weight;\n }\n }\n \n const pos = (y * width + x) * 4;\n const value = Math.round(sum / weightSum);\n outputData[pos] = outputData[pos + 1] = outputData[pos + 2] = value;\n outputData[pos + 3] = 255;\n }\n }\n \n return new ImageData(outputData, width, height);\n }\n \n /**\n * 生成高斯核\n */\n private static generateGaussianKernel(size: number, sigma: number): number[] {\n const kernel = new Array(size * size);\n const center = Math.floor(size / 2);\n let sum = 0;\n \n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const distance = Math.sqrt((x - center) ** 2 + (y - center) ** 2);\n const value = Math.exp(-(distance ** 2) / (2 * sigma ** 2));\n \n kernel[y * size + x] = value;\n sum += value;\n }\n }\n \n // 归一化\n for (let i = 0; i < kernel.length; i++) {\n kernel[i] /= sum;\n }\n \n return kernel;\n }\n \n /**\n * 计算梯度强度和方向\n */\n private static computeGradients(imageData: ImageData): { \n gradientMagnitude: number[], \n gradientDirection: number[] \n } {\n const width = imageData.width;\n const height = imageData.height;\n const inputData = imageData.data;\n \n const gradientMagnitude = new Array(width * height);\n const gradientDirection = new Array(width * height);\n \n // Sobel算子\n const sobelX = [-1, 0, 1, -2, 0, 2, -1, 0, 1];\n const sobelY = [-1, -2, -1, 0, 0, 0, 1, 2, 1];\n \n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n let gx = 0;\n let gy = 0;\n \n for (let ky = -1; ky <= 1; ky++) {\n for (let kx = -1; kx <= 1; kx++) {\n const pixelPos = ((y + ky) * width + (x + kx)) * 4;\n const pixelVal = inputData[pixelPos];\n \n const kernelIdx = (ky + 1) * 3 + (kx + 1);\n gx += pixelVal * sobelX[kernelIdx];\n gy += pixelVal * sobelY[kernelIdx];\n }\n }\n \n const idx = y * width + x;\n gradientMagnitude[idx] = Math.sqrt(gx * gx + gy * gy);\n gradientDirection[idx] = Math.atan2(gy, gx);\n }\n }\n \n // 处理边界\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n if (y === 0 || y === height - 1 || x === 0 || x === width - 1) {\n const idx = y * width + x;\n gradientMagnitude[idx] = 0;\n gradientDirection[idx] = 0;\n }\n }\n }\n \n return { gradientMagnitude, gradientDirection };\n }\n \n /**\n * 非极大值抛弃\n */\n private static nonMaxSuppression(\n gradientMagnitude: number[], \n gradientDirection: number[], \n width: number, \n height: number\n ): number[] {\n const result = new Array(width * height).fill(0);\n \n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n const idx = y * width + x;\n const magnitude = gradientMagnitude[idx];\n const direction = gradientDirection[idx];\n \n // 将方向转化为角度\n const degrees = (direction * 180 / Math.PI + 180) % 180;\n \n // 获取相邻像素索引\n let neighbor1Idx, neighbor2Idx;\n \n // 将方向量化为四个方向: 0°, 45°, 90°, 135°\n if ((degrees >= 0 && degrees < 22.5) || (degrees >= 157.5 && degrees <= 180)) {\n // 水平方向\n neighbor1Idx = idx - 1;\n neighbor2Idx = idx + 1;\n } else if (degrees >= 22.5 && degrees < 67.5) {\n // 45度方向\n neighbor1Idx = (y - 1) * width + (x + 1);\n neighbor2Idx = (y + 1) * width + (x - 1);\n } else if (degrees >= 67.5 && degrees < 112.5) {\n // 垂直方向\n neighbor1Idx = (y - 1) * width + x;\n neighbor2Idx = (y + 1) * width + x;\n } else {\n // 135度方向\n neighbor1Idx = (y - 1) * width + (x - 1);\n neighbor2Idx = (y + 1) * width + (x + 1);\n }\n \n // 检查当前像素是否是最大值\n if (magnitude >= gradientMagnitude[neighbor1Idx] && \n magnitude >= gradientMagnitude[neighbor2Idx]) {\n result[idx] = magnitude;\n }\n }\n }\n \n return result;\n }\n \n /**\n * 双阈值处理\n */\n private static hysteresisThresholding(\n nonMaxSuppressed: number[], \n width: number, \n height: number, \n lowThreshold: number, \n highThreshold: number\n ): boolean[] {\n const result = new Array(width * height).fill(false);\n const visited = new Array(width * height).fill(false);\n const stack = [];\n \n // 标记强边缘点\n for (let i = 0; i < nonMaxSuppressed.length; i++) {\n if (nonMaxSuppressed[i] >= highThreshold) {\n result[i] = true;\n stack.push(i);\n visited[i] = true;\n }\n }\n \n // 使用深度优先搜索连接弱边缘\n const dx = [-1, 0, 1, -1, 1, -1, 0, 1];\n const dy = [-1, -1, -1, 0, 0, 1, 1, 1];\n \n while (stack.length > 0) {\n const currentIdx: number = stack.pop()!;\n const currentX: number = currentIdx % width;\n const currentY: number = Math.floor(currentIdx / width);\n \n // 检查88个相邻方向\n for (let i = 0; i < 8; i++) {\n const newX: number = currentX + dx[i];\n const newY: number = currentY + dy[i];\n \n if (newX >= 0 && newX < width && newY >= 0 && newY < height) {\n const newIdx: number = newY * width + newX;\n \n if (!visited[newIdx] && nonMaxSuppressed[newIdx] >= lowThreshold) {\n result[newIdx] = true;\n stack.push(newIdx);\n visited[newIdx] = true;\n }\n }\n }\n }\n \n return result;\n }\n}\n","/**\n * @file 性能优化工具\n * @description 提供性能优化相关的工具函数\n * @module utils/performance\n */\n\n/**\n * LRU缓存实现\n */\nexport class LRUCache<K, V> {\n private capacity: number;\n private cache: Map<K, V>;\n\n /**\n * 构造函数\n * @param capacity 缓存容量\n */\n constructor(capacity: number = 100) {\n this.capacity = capacity;\n this.cache = new Map<K, V>();\n }\n\n /**\n * 获取缓存项\n * @param key 键\n * @returns 值,如果不存在则返回undefined\n */\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined;\n }\n\n // 获取值\n const value = this.cache.get(key)!;\n \n // 删除旧位置\n this.cache.delete(key);\n\n // 添加到最新位置\n this.cache.set(key, value);\n\n return value;\n }\n\n /**\n * 设置缓存项\n * @param key 键\n * @param value 值\n */\n set(key: K, value: V): void {\n // 如果已存在,先删除\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n // 如果缓存已满,删除最旧的项\n else if (this.cache.size >= this.capacity) {\n this.cache.delete(this.cache.keys().next().value as K);\n }\n\n // 添加新项\n this.cache.set(key, value);\n }\n \n /**\n * 检查键是否存在\n * @param key 键\n * @returns 是否存在\n */\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n /**\n * 删除缓存项\n * @param key 键\n * @returns 是否成功删除\n */\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * 清空缓存\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * 获取缓存大小\n */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * 获取所有键\n */\n keys(): IterableIterator<K> {\n return this.cache.keys();\n }\n \n /**\n * 获取所有值\n */\n values(): IterableIterator<V> {\n return this.cache.values();\n }\n \n /**\n * 获取所有项\n */\n entries(): IterableIterator<[K, V]> {\n return this.cache.entries();\n }\n}\n\n/**\n * 计算图像指纹\n * @param imageData 图像数据\n * @returns 图像指纹\n */\nexport function calculateImageFingerprint(imageData: ImageData): string {\n const { width, height, data } = imageData;\n \n // 缩小图像以加快计算速度\n const scale = Math.min(1, 32 / Math.max(width, height));\n const scaledWidth = Math.max(8, Math.floor(width * scale));\n const scaledHeight = Math.max(8, Math.floor(height * scale));\n \n // 创建缩小的图像\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('无法创建Canvas上下文');\n }\n \n // 设置canvas尺寸\n canvas.width = scaledWidth;\n canvas.height = scaledHeight;\n\n // 创建临时canvas存储原始ImageData\n const tempCanvas = document.createElement('canvas');\n const tempCtx = tempCanvas.getContext('2d');\n\n if (!tempCtx) {\n throw new Error('无法创建临时Canvas上下文');\n }\n\n tempCanvas.width = width;\n tempCanvas.height = height;\n tempCtx.putImageData(imageData, 0, 0);\n \n // 绘制缩小的图像\n ctx.drawImage(tempCanvas, 0, 0, width, height, 0, 0, scaledWidth, scaledHeight);\n \n // 获取缩小的图像数据\n const scaledImageData = ctx.getImageData(0, 0, scaledWidth, scaledHeight);\n \n // 计算灰度值\n const grayValues = new Uint8Array(scaledWidth * scaledHeight);\n\n for (let i = 0; i < scaledWidth * scaledHeight; i++) {\n const idx = i * 4;\n grayValues[i] = Math.round(\n 0.299 * scaledImageData.data[idx] +\n 0.587 * scaledImageData.data[idx + 1] +\n 0.114 * scaledImageData.data[idx + 2]\n );\n }\n \n // 计算平均值\n let sum = 0;\n for (let i = 0; i < grayValues.length; i++) {\n sum += grayValues[i];\n }\n const avg = sum / grayValues.length;\n \n // 计算哈希值\n let hash = '';\n for (let i = 0; i < grayValues.length; i++) {\n hash += grayValues[i] >= avg ? '1' : '0';\n }\n \n return hash;\n }\n\n/**\n * 防抖函数\n * @param func 要执行的函数\n * @param wait 等待时间(毫秒)\n * @returns 防抖处理后的函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: number | null = null;\n \n return function(this: any, ...args: Parameters<T>): void {\n const later = () => {\n timeout = null;\n func.apply(this, args);\n };\n \n if (timeout !== null) {\n clearTimeout(timeout);\n }\n \n timeout = window.setTimeout(later, wait) as unknown as number;\n };\n}\n\n/**\n * 节流函数\n * @param func 要执行的函数\n * @param limit 时间限制(毫秒)\n * @returns 节流处理后的函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle = false;\n let lastFunc: number | null = null;\n let lastRan: number | null = null;\n \n return function(this: any, ...args: Parameters<T>): void {\n if (!inThrottle) {\n func.apply(this, args);\n lastRan = Date.now();\n inThrottle = true;\n } else {\n if (lastFunc !== null) {\n clearTimeout(lastFunc);\n }\n \n lastFunc = window.setTimeout(() => {\n if (lastRan !== null && Date.now() - lastRan >= limit) {\n func.apply(this, args);\n lastRan = Date.now();\n }\n }, limit - (lastRan !== null ? Date.now() - lastRan : 0)) as unknown as number;\n }\n };\n}\n","/**\n * @file Worker工具\n * @description 提供Web Worker相关的工具函数\n * @module utils/worker\n */\n\n/**\n * 检查是否支持Web Worker\n * @returns 是否支持Web Worker\n */\nexport function isWorkerSupported(): boolean {\n return typeof Worker !== 'undefined';\n}\n\n/**\n * 创建Worker\n * @param workerFunction Worker函数\n * @returns Worker实例\n */\nexport function createWorker<TInput, TOutput>(\n workerFunction: (input: TInput) => TOutput | Promise<TOutput>\n): {\n postMessage: (input: TInput) => Promise<TOutput>;\n terminate: () => void;\n} {\n // 检查是否支持Web Worker\n if (!isWorkerSupported()) {\n // 回退到主线程执行\n return {\n postMessage: async (input: TInput) => {\n return await Promise.resolve(workerFunction(input));\n },\n terminate: () => {}\n };\n }\n \n // 将函数转换为字符串\n const workerFunctionStr = workerFunction.toString();\n \n // 创建Worker脚本\n const workerScript = `\n // 定义Worker函数\n const workerFunction = ${workerFunctionStr};\n \n // 监听消息\n self.addEventListener('message', async (event) => {\n try {\n const input = event.data;\n const result = await workerFunction(input);\n self.postMessage({ success: true, result });\n } catch (error) {\n self.postMessage({ \n success: false, \n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n `;\n \n // 创建Blob URL\n const blob = new Blob([workerScript], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n \n // 创建Worker\n const worker = new Worker(url);\n\n // 创建Promise映射\n const promiseMap = new Map<number, {\n resolve: (value: TOutput) => void;\n reject: (reason: any) => void;\n }>();\n \n // 消息计数器\n let messageCounter = 0;\n \n // 监听Worker消息\n worker.addEventListener('message', (event) => {\n const { messageId, success, result, error: _error } = event.data;\n \n // 查找对应的Promise\n const promiseHandlers = promiseMap.get(messageId);\n if (promiseHandlers) {\n if (success) {\n promiseHandlers.resolve(result);\n } else {\n promiseHandlers.reject(new Error(_error));\n }\n \n // 删除Promise映射\n promiseMap.delete(messageId);\n }\n });\n\n // 返回Worker接口\n return {\n postMessage: (input: TInput): Promise<TOutput> => {\n return new Promise<TOutput>((resolve, reject) => {\n // 生成消息ID\n const messageId = messageCounter++;\n \n // 保存Promise处理函数\n promiseMap.set(messageId, { resolve, reject });\n \n // 发送消息到Worker\n worker.postMessage({ messageId, input });\n });\n },\n terminate: () => {\n // 终止Worker\n worker.terminate();\n \n // 释放Blob URL\n URL.revokeObjectURL(url);\n \n // 拒绝所有未完成的Promise\n for (const [, { reject: _reject }] of promiseMap) {\n _reject(new Error('Worker已终止'));\n }\n \n // 清空Promise映射\n promiseMap.clear();\n }\n };\n}\n\n/**\n * 工作线程池\n * 用于管理和重用Worker线程,避免频繁创建和销毁\n */\nexport class WorkerPool<T, R> {\n private workers: Array<{\n worker: ReturnType<typeof createWorker<T, R>>\n busy: boolean\n }> = []\n\n /**\n * 创建工作线程池\n *\n * @param workerFunction 要在Worker中执行的函数\n * @param size 池中Worker的数量\n */\n constructor(\n private workerFunction: (data: T) => Promise<R> | R,\n private size: number = navigator.hardwareConcurrency || 4\n ) {\n // 更精确的 workerFunction 类型\n // 预创建Workers\n for (let i = 0; i < size; i++) {\n this.workers.push({\n worker: createWorker<T, R>(workerFunction),\n busy: false,\n })\n }\n }\n\n /**\n * 获取一个可用的Worker\n *\n * @returns Worker包装对象\n */\n private getAvailableWorker(): ReturnType<typeof createWorker<T, R>> {\n // 找到第一个空闲的Worker\n const availableWorker = this.workers.find((w) => !w.busy)\n\n if (availableWorker) {\n availableWorker.busy = true\n return availableWorker.worker\n }\n\n // 如果没有空闲Worker,创建一个新的\n const worker = createWorker<T, R>(this.workerFunction)\n this.workers.push({ worker, busy: true })\n return worker\n }\n\n /**\n * 执行任务\n *\n * @param data 要处理的数据\n * @returns 处理结果的Promise\n */\n async execute(data: T): Promise<R> {\n const worker = this.getAvailableWorker()\n\n try {\n const result = await worker.postMessage(data)\n // 标记Worker为空闲\n const workerEntry = this.workers.find((w) => w.worker === worker)\n if (workerEntry) {\n workerEntry.busy = false\n }\n return result\n } catch (error) {\n // 出错时也标记为空闲\n const workerEntry = this.workers.find((w) => w.worker === worker)\n if (workerEntry) {\n workerEntry.busy = false\n }\n throw error\n }\n }\n\n /**\n * 终止所有Worker\n */\n terminate(): void {\n this.workers.forEach(({ worker }) => {\n worker.terminate()\n })\n this.workers = []\n }\n}\n","/**\n * @file OCR Worker\n * @description OCR处理的Worker线程实现\n * @module modules/id-card/ocr-worker\n */\n\nimport { IDCardInfo, IDCardType } from './types';\nimport { LoggerMessage } from 'tesseract.js';\n\n/**\n * OCR处理输入参数\n */\nexport interface OCRProcessInput {\n /** 图像Base64数据 */\n imageBase64: string;\n /** Tesseract Worker选项 */\n tessWorkerOptions?: {\n /** 语言 */\n language?: string;\n /** 日志回调 */\n logger?: (message: LoggerMessage) => void;\n };\n}\n\n/**\n * 在Worker中处理OCR识别\n * @param input OCR处理输入参数\n * @returns OCR处理结果\n */\nexport async function processOCRInWorker(\n input: OCRProcessInput\n): Promise<{ idCardInfo: IDCardInfo; processingTime: number }> {\n const startTime = performance.now();\n\n try {\n // 导入Tesseract.js\n const { createWorker } = await import('tesseract.js');\n\n // 创建Tesseract Worker\n const worker = createWorker({\n logger: input.tessWorkerOptions?.logger\n });\n\n // 初始化Worker\n await worker.load();\n await worker.loadLanguage('chi_sim');\n await worker.initialize('chi_sim');\n\n // 设置识别参数\n await worker.setParameters({\n tessedit_char_whitelist: '0123456789X年月日壹贰叁肆伍陆柒捌玖拾民族汉满回维吾尔藏苗彝壮朝鲜侗瑶白土家哈尼哈萨克傣黎傈僳佤高山拉祜水东乡纳西景颇柯尔克孜达斡尔仫佬羌布朗撒拉毛南仡佬锡伯阿昌普米塔吉克怒乌孜别克俄罗斯鄂温克德昂保安裕固京塔塔尔独龙鄂伦春赫哲门巴珞巴基诺男女住址出生公民身份号码签发机关有效期省市区县乡镇街道号楼单元室ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n tessedit_pageseg_mode: 7, // PSM_SINGLE_LINE\n preserve_interword_spaces: '1'\n });\n\n // 识别图像\n const { data } = await worker.recognize(input.imageBase64);\n\n // 解析身份证信息\n const idCardInfo = parseIDCardText(data.text);\n\n // 释放Worker资源\n await worker.terminate();\n\n const processingTime = performance.now() - startTime;\n\n return { idCardInfo, processingTime };\n } catch (error) {\n console.error('OCR处理错误:', error);\n return {\n idCardInfo: {} as IDCardInfo,\n processingTime: performance.now() - startTime\n };\n }\n}\n\n/**\n * 解析身份证文本\n * @param text OCR识别的文本\n * @returns 解析后的身份证信息\n */\nfunction parseIDCardText(text: string): IDCardInfo {\n const info: IDCardInfo = {};\n\n // 预处理文本,清除多余空白\n const processedText = text.replace(/\\s+/g, ' ').trim();\n\n // 解析身份证号码\n const idNumberRegex = /(\\d{17}[\\dX])/;\n const idNumberWithPrefixRegex = /公民身份号码[\\s\\:]*(\\d{17}[\\dX])/;\n\n const basicMatch = processedText.match(idNumberRegex);\n const prefixMatch = processedText.match(idNumberWithPrefixRegex);\n\n if (prefixMatch && prefixMatch[1]) {\n info.idNumber = prefixMatch[1];\n } else if (basicMatch && basicMatch[1]) {\n info.idNumber = basicMatch[1];\n }\n\n // 解析姓名\n const nameWithLabelRegex = /姓名[\\s\\:]*([一-龥]{2,4})/;\n const nameMatch = processedText.match(nameWithLabelRegex);\n\n if (nameMatch && nameMatch[1]) {\n info.name = nameMatch[1].trim();\n } else {\n // 备用方案:查找短行且内容全是汉字\n const lines = processedText.split('\\n').filter(line => line.trim());\n for (const line of lines) {\n if (\n line.length >= 2 &&\n line.length <= 5 &&\n /^[一-龥]+$/.test(line) &&\n !/性别|民族|住址|公民|签发|有效/.test(line)\n ) {\n info.name = line.trim();\n break;\n }\n }\n }\n\n // 解析性别和民族\n const genderAndNationalityRegex = /性别[\\s\\:]*([男女])[\\s ]*民族[\\s\\:]*([一-龥]+族)/;\n const genderOnlyRegex = /性别[\\s\\:]*([男女])/;\n const nationalityOnlyRegex = /民族[\\s\\:]*([一-龥]+族)/;\n\n const genderNationalityMatch = processedText.match(genderAndNationalityRegex);\n const genderOnlyMatch = processedText.match(genderOnlyRegex);\n const nationalityOnlyMatch = processedText.match(nationalityOnlyRegex);\n\n if (genderNationalityMatch) {\n info.gender = genderNationalityMatch[1];\n info.ethnicity = genderNationalityMatch[2];\n } else {\n if (genderOnlyMatch) info.gender = genderOnlyMatch[1];\n if (nationalityOnlyMatch) info.ethnicity = nationalityOnlyMatch[1];\n }\n\n // 根据内容判断身份证类型\n if (processedText.includes('出生') || processedText.includes('公民身份号码')) {\n info.type = IDCardType.FRONT; // 确保类型为枚举值而不是字符串\n } else if (processedText.includes('签发机关') || processedText.includes('有效期')) {\n info.type = IDCardType.BACK; // 确保类型为枚举值而不是字符串\n }\n\n // 解析出生日期\n const birthDateRegex1 = /出生[\\s\\:]*(\\d{4})年(\\d{1,2})月(\\d{1,2})[日号]/;\n const birthDateRegex2 = /出生[\\s\\:]*(\\d{4})[-\\/\\.](\\d{1,2})[-\\/\\.](\\d{1,2})/;\n const birthDateRegex3 = /出生日期[\\s\\:]*(\\d{4})[-\\/\\.\\u5e74](\\d{1,2})[-\\/\\.\\u6708](\\d{1,2})[日号]?/;\n\n const birthDateMatch =\n processedText.match(birthDateRegex1) ||\n processedText.match(birthDateRegex2) ||\n processedText.match(birthDateRegex3);\n\n if (!birthDateMatch && info.idNumber && info.idNumber.length === 18) {\n const year = info.idNumber.substring(6, 10);\n const month = info.idNumber.substring(10, 12);\n const day = info.idNumber.substring(12, 14);\n info.birthDate = `${year}-${month}-${day}`;\n } else if (birthDateMatch) {\n const year = birthDateMatch[1];\n const month = birthDateMatch[2].padStart(2, '0');\n const day = birthDateMatch[3].padStart(2, '0');\n info.birthDate = `${year}-${month}-${day}`;\n }\n\n // 解析地址\n const addressRegex1 = /住址[\\s\\:]*([\\s\\S]*?)(?=公民身份|出生|性别|签发)/;\n const addressRegex2 = /住址[\\s\\:]*([一-龥a-zA-Z0-9\\s\\.\\-]+)/;\n\n const addressMatch =\n processedText.match(addressRegex1) || processedText.match(addressRegex2);\n\n if (addressMatch && addressMatch[1]) {\n info.address = addressMatch[1]\n .replace(/\\s+/g, '')\n .replace(/\\n/g, '')\n .trim();\n\n if (info.address.length > 70) {\n info.address = info.address.substring(0, 70);\n }\n\n if (!/[一-龥]/.test(info.address)) {\n info.address = '';\n }\n }\n\n // 解析签发机关\n const authorityRegex1 = /签发机关[\\s\\:]*([\\s\\S]*?)(?=有效|公民|出生|\\d{8}|$)/;\n const authorityRegex2 = /签发机关[\\s\\:]*([一-龥\\s]+)/;\n\n const authorityMatch =\n processedText.match(authorityRegex1) ||\n processedText.match(authorityRegex2);\n\n if (authorityMatch && authorityMatch[1]) {\n info.issueAuthority = authorityMatch[1]\n .replace(/\\s+/g, '')\n .replace(/\\n/g, '')\n .trim();\n }\n\n // 解析有效期限\n const validPeriodRegex1 = /有效期限[\\s\\:]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日\\s]*)[-\\s]*(至|-)[-\\s]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日]*|[永久长期]*)/;\n const validPeriodRegex2 = /有效期限[\\s\\:]*(\\d{8})[-\\s]*(至|-)[-\\s]*(\\d{8}|[永久长期]*)/;\n\n const validPeriodMatch =\n processedText.match(validPeriodRegex1) ||\n processedText.match(validPeriodRegex2);\n\n if (validPeriodMatch) {\n if (validPeriodMatch[1] && validPeriodMatch[3]) {\n const startDate = formatDateString(validPeriodMatch[1]);\n const endDate = /\\d/.test(validPeriodMatch[3])\n ? formatDateString(validPeriodMatch[3])\n : '长期有效';\n\n info.validFrom = startDate;\n info.validTo = endDate;\n info.validPeriod = `${startDate}-${endDate}`;\n } else {\n info.validPeriod = validPeriodMatch[0].replace('有效期限', '').trim();\n }\n }\n\n return info;\n}\n\n/**\n * 格式化日期字符串\n * @param dateStr 原始日期字符串\n * @returns 格式化后的日期字符串\n */\nfunction formatDateString(dateStr: string): string {\n // 提取年月日\n const dateMatch = dateStr.match(\n /(\\d{4})[-\\.\\u5e74\\s]*(\\d{1,2})[-\\.\\u6708\\s]*(\\d{1,2})[日]*/\n );\n if (dateMatch) {\n const year = dateMatch[1];\n const month = dateMatch[2].padStart(2, '0');\n const day = dateMatch[3].padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n\n // 纯数字格式如 20220101\n if (/^\\d{8}$/.test(dateStr)) {\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 6);\n const day = dateStr.substring(6, 8);\n return `${year}-${month}-${day}`;\n }\n\n // 无法格式化,返回原始字符串\n return dateStr;\n}\n","/**\n * @file OCR处理器\n * @description 提供身份证OCR识别功能\n * @module modules/id-card/ocr-processor\n */\n\nimport { EventEmitter } from '../../core/event-emitter';\nimport { Logger } from '../../core/logger';\nimport { IDCardType, IDCardInfo } from './types';\nimport {\n createWorker,\n Worker as TesseractWorker,\n LoggerMessage,\n WorkerOptions,\n} from \"tesseract.js\" // 导入 Worker 和 LoggerMessage 类型\nimport { ImageProcessor } from \"../../utils/image-processing\"\nimport { LRUCache, calculateImageFingerprint } from \"../../utils/performance\"\nimport {\n isWorkerSupported,\n createWorker as createCustomWorker,\n} from \"../../utils/worker\" \nimport { processOCRInWorker, OCRProcessInput } from \"./ocr-worker\"\nimport { Disposable } from \"../../utils/resource-manager\"\n\n// 自定义日志函数类型,兼容字符串和LoggerMessage\ntype LoggerFunction = ((message: string | LoggerMessage) => void) | undefined;\n\n/**\n * OCR处理器选项接口\n */\nexport interface OCRProcessorOptions {\n language?: string\n useWorker?: boolean\n maxImageDimension?: number\n timeout?: number\n brightness?: number // 新增亮度参数\n contrast?: number // 新增对比度参数\n onProgress?: (progress: number) => void\n enableCache?: boolean // 添加启用缓存选项\n cacheSize?: number // 添加缓存大小选项\n logger?: LoggerFunction // 修改为兼容字符串的日志函数类型\n}\n\n/**\n * OCR处理器类\n *\n * 使用Tesseract.js实现对身份证图像的OCR文字识别和信息提取功能\n *\n * @example\n * ```typescript\n * // 创建OCR处理器\n * const ocrProcessor = new OCRProcessor();\n *\n * // 初始化OCR引擎\n * await ocrProcessor.initialize();\n *\n * // 处理身份证图像\n * const idInfo = await ocrProcessor.processIDCard(idCardImageData);\n * console.log('识别到的身份证信息:', idInfo);\n *\n * // 使用结束后释放资源\n * await ocrProcessor.terminate();\n * ```\n */\nexport class OCRProcessor implements Disposable {\n private worker: TesseractWorker | null = null // 使用导入的 TesseractWorker 类型\n private ocrWorker: ReturnType<\n typeof createCustomWorker<\n OCRProcessInput,\n { idCardInfo: IDCardInfo; processingTime: number }\n >\n > | null = null\n private initialized: boolean = false\n private resultCache: LRUCache<string, IDCardInfo>\n private options: OCRProcessorOptions\n\n /**\n * 创建OCR处理器实例\n *\n * @param options OCR处理器选项\n */\n constructor(options: OCRProcessorOptions = {}) {\n this.options = {\n useWorker: isWorkerSupported(),\n enableCache: true,\n cacheSize: 50,\n maxImageDimension: 1000,\n logger: console.log,\n ...options,\n }\n\n // 初始化缓存\n this.resultCache = new LRUCache<string, IDCardInfo>(this.options.cacheSize)\n }\n\n /**\n * 初始化OCR引擎\n *\n * 加载Tesseract OCR引擎和中文简体语言包,并设置适合身份证识别的参数\n *\n * @returns {Promise<void>} 初始化完成的Promise\n */\n async initialize(): Promise<void> {\n if (this.initialized) return\n\n if (this.options.useWorker) {\n // 使用自定义Worker线程处理OCR\n this.ocrWorker = createCustomWorker<\n OCRProcessInput,\n { idCardInfo: IDCardInfo; processingTime: number }\n >(processOCRInWorker as any) // 使用类型断言解决类型不兼容问题\n this.initialized = true\n this.options.logger?.(\"OCR Worker 初始化完成\")\n } else {\n // 使用主线程处理OCR\n this.worker = createWorker({\n logger: this.options.logger,\n })\n\n await this.worker.load()\n await this.worker.loadLanguage(\"chi_sim\")\n await this.worker.initialize(\"chi_sim\")\n await this.worker.setParameters({\n tessedit_char_whitelist:\n \"0123456789X年月日壹贰叁肆伍陆柒捌玖拾民族汉满回维吾尔藏苗彝壮朝鲜侗瑶白土家哈尼哈萨克傣黎傈僳佤高山拉祜水东乡纳西景颇柯尔克孜达斡尔仫佬羌布朗撒拉毛南仡佬锡伯阿昌普米塔吉克怒乌孜别克俄罗斯鄂温克德昂保安裕固京塔塔尔独龙鄂伦春赫哲门巴珞巴基诺男女住址出生公民身份号码签发机关有效期省市区县乡镇街道号楼单元室ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\", // 优化字符白名单,增加常见地址字符,移除部分不常用汉字\n })\n // 增加一些针对性的参数,提高识别率\n await this.worker.setParameters({\n tessedit_pageseg_mode: 7, // PSM_SINGLE_LINE,使用数字而不是字符串\n preserve_interword_spaces: \"1\", // 保留单词间的空格\n })\n\n this.initialized = true\n this.options.logger?.(\"OCR引擎初始化完成\")\n }\n }\n\n /**\n * 处理身份证图像并提取信息\n * @param imageData 要处理的身份证图像数据\n * @returns 提取的身份证信息\n */\n async processIDCard(imageData: ImageData): Promise<IDCardInfo> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n // 计算图像指纹,用于缓存查找\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n\n // 检查缓存中是否有结果\n const cachedResult = this.resultCache.get(fingerprint)\n if (cachedResult) {\n this.options.logger?.(\"使用缓存的OCR结果\")\n return cachedResult\n }\n }\n\n // 调整图像大小以提高性能和准确性\n const downsampledImage = ImageProcessor.resizeImage(\n imageData,\n this.options.maxImageDimension || 1000,\n this.options.maxImageDimension || 1000,\n true // 保持宽高比\n )\n\n // 提高图像质量以获得更好的OCR结果\n const enhancedImage = ImageProcessor.batchProcess(downsampledImage, {\n brightness:\n this.options.brightness !== undefined ? this.options.brightness : 10, // 调整默认亮度\n contrast:\n this.options.contrast !== undefined ? this.options.contrast : 20, // 调整默认对比度\n sharpen: true, // 默认启用锐化,通常对OCR有益\n })\n\n // 转换为base64供Tesseract处理\n // 创建一个canvas元素\n const canvas = document.createElement(\"canvas\")\n canvas.width = enhancedImage.width\n canvas.height = enhancedImage.height\n const ctx = canvas.getContext(\"2d\")\n\n if (!ctx) {\n throw new Error(\"无法创建canvas上下文\")\n }\n\n // 将ImageData绘制到canvas\n ctx.putImageData(enhancedImage, 0, 0)\n\n // 转换为Base64\n const base64Image = canvas.toDataURL(\"image/jpeg\", 0.7)\n\n // OCR识别\n try {\n let idCardInfo: IDCardInfo\n\n if (this.options.useWorker && this.ocrWorker) {\n // 使用Worker线程处理\n const result = await this.ocrWorker.postMessage({\n imageBase64: base64Image,\n // 不传递函数对象,避免DataCloneError\n tessWorkerOptions: {},\n })\n\n idCardInfo = result.idCardInfo\n this.options.logger?.(\n `OCR处理完成,用时: ${result.processingTime.toFixed(2)}ms`\n )\n } else {\n // 使用主线程处理\n const startTime = performance.now()\n\n // 转换ImageData为Canvas\n const canvas = ImageProcessor.imageDataToCanvas(enhancedImage)\n\n // 确保worker已初始化\n if (!this.worker) {\n throw new Error(\"OCR引擎未初始化\");\n }\n\n const { data } = (await this.worker.recognize(canvas)) as {\n data: { text: string }\n }\n\n // 解析身份证信息\n idCardInfo = this.parseIDCardText(data.text)\n\n const processingTime = performance.now() - startTime\n this.options.logger?.(\n `OCR处理完成,用时: ${processingTime.toFixed(2)}ms`\n )\n }\n\n // 缓存结果\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n this.resultCache.set(fingerprint, idCardInfo)\n }\n\n return idCardInfo\n } catch (error) {\n // 改进错误处理\n const errorMessage = error instanceof Error \n ? error.message \n : typeof error === 'object' \n ? JSON.stringify(error) \n : String(error);\n \n this.options.logger?.(`OCR识别错误: ${errorMessage}`);\n \n // 返回空对象,避免完全失败\n return {} as IDCardInfo\n }\n }\n\n /**\n * 解析身份证文本信息\n *\n * 从OCR识别到的文本中提取结构化的身份证信息\n *\n * @private\n * @param {string} text - OCR识别到的文本\n * @returns {IDCardInfo} 提取到的身份证信息对象\n */\n /**\n * 格式化日期字符串为标准格式 (YYYY-MM-DD)\n * @param dateStr 原始日期字符串\n * @returns 格式化后的日期字符串\n */\n private formatDateString(dateStr: string): string {\n // 先尝试提取年月日\n const dateMatch = dateStr.match(\n /(\\d{4})[-\\.\\u5e74\\s]*(\\d{1,2})[-\\.\\u6708\\s]*(\\d{1,2})[日]*/\n )\n if (dateMatch) {\n const year = dateMatch[1]\n const month = dateMatch[2].padStart(2, \"0\")\n const day = dateMatch[3].padStart(2, \"0\")\n return `${year}-${month}-${day}`\n }\n\n // 如果是纯数字格式如 20220101\n if (/^\\d{8}$/.test(dateStr)) {\n const year = dateStr.substring(0, 4)\n const month = dateStr.substring(4, 6)\n const day = dateStr.substring(6, 8)\n return `${year}-${month}-${day}`\n }\n\n // 如果无法格式化,返回原始字符串\n return dateStr\n }\n\n /**\n * 验证身份证号是否符合规则\n * @param idNumber 身份证号\n * @returns 是否有效\n */\n private validateIDNumber(idNumber: string): boolean {\n // 基本验证,校验位有效性和长度\n if (!idNumber || idNumber.length !== 18) {\n return false\n }\n\n // 检查格式,前17位必须为数字,最后一位可以是数字或'X'\n const pattern = /^\\d{17}[\\dX]$/\n if (!pattern.test(idNumber)) {\n return false\n }\n\n // 检查日期部分\n const year = parseInt(idNumber.substr(6, 4))\n const month = parseInt(idNumber.substr(10, 2))\n const day = parseInt(idNumber.substr(12, 2))\n\n if (month < 1 || month > 12 || day < 1 || day > 31) {\n return false\n }\n\n // 更详细的检查可以添加校验位的验证等逻辑...\n\n return true\n }\n\n private parseIDCardText(text: string): IDCardInfo {\n const info: IDCardInfo = {}\n\n // 预处理文本,清除多余空白\n const processedText = text.replace(/\\s+/g, \" \").trim()\n\n // 拆分为行,并过滤空行\n const lines = processedText.split(\"\\n\").filter((line) => line.trim())\n\n // 解析身份证号码 - 多种模式匹配\n // 1. 普通18位身份证号模式\n const idNumberRegex = /(\\d{17}[\\dX])/\n // 2. 带前缀的模式\n const idNumberWithPrefixRegex = /公民身份号码[\\s\\:]*(\\d{17}[\\dX])/\n\n // 尝试所有模式\n let idNumber = null\n const basicMatch = processedText.match(idNumberRegex)\n const prefixMatch = processedText.match(idNumberWithPrefixRegex)\n\n if (prefixMatch && prefixMatch[1]) {\n idNumber = prefixMatch[1] // 首选带前缀的匹配,因为最可靠\n } else if (basicMatch && basicMatch[1]) {\n idNumber = basicMatch[1] // 其次是常规匹配\n }\n\n if (idNumber) {\n info.idNumber = idNumber\n }\n\n // 解析姓名 - 使用多种策略\n // 1. 直接匹配姓名标签近的内容\n const nameWithLabelRegex = /姓名[\\s\\:]*([一-龥]{2,4})/\n const nameMatch = processedText.match(nameWithLabelRegex)\n\n // 2. 分析行文本寻找姓名\n if (nameMatch && nameMatch[1]) {\n info.name = nameMatch[1].trim()\n } else {\n // 备用方案:查找短行且内容全是汉字\n for (const line of lines) {\n if (\n line.length >= 2 &&\n line.length <= 5 &&\n /^[一-龥]+$/.test(line) &&\n !/性别|民族|住址|公民|签发|有效/.test(line)\n ) {\n info.name = line.trim()\n break\n }\n }\n }\n\n // 解析性别和民族 - 多种模式匹配\n // 1. 标准格式匹配\n const genderAndNationalityRegex =\n /性别[\\s\\:]*([男女])[\\s ]*民族[\\s\\:]*([一-龥]+族)/\n const genderNationalityMatch = processedText.match(\n genderAndNationalityRegex\n )\n\n // 2. 只匹配性别\n const genderOnlyRegex = /性别[\\s\\:]*([男女])/\n const genderOnlyMatch = processedText.match(genderOnlyRegex)\n\n // 3. 只匹配民族\n const nationalityOnlyRegex = /民族[\\s\\:]*([一-龥]+族)/\n const nationalityOnlyMatch = processedText.match(nationalityOnlyRegex)\n\n if (genderNationalityMatch) {\n info.gender = genderNationalityMatch[1]\n info.nationality = genderNationalityMatch[2]\n } else {\n // 分开获取\n if (genderOnlyMatch) info.gender = genderOnlyMatch[1]\n if (nationalityOnlyMatch) info.nationality = nationalityOnlyMatch[1]\n }\n\n // 解析出生日期 - 支持多种格式\n // 1. 标准格式:YYYY年MM月DD日\n const birthDateRegex1 = /出生[\\s\\:]*(\\d{4})年(\\d{1,2})月(\\d{1,2})[日号]/\n // 2. 美式日期格式:YYYY-MM-DD或YYYY/MM/DD\n const birthDateRegex2 = /出生[\\s\\:]*(\\d{4})[-\\/\\.](\\d{1,2})[-\\/\\.](\\d{1,2})/\n // 3. 带前缀的格式\n const birthDateRegex3 =\n /出生日期[\\s\\:]*(\\d{4})[-\\/\\.\\u5e74](\\d{1,2})[-\\/\\.\\u6708](\\d{1,2})[日号]?/\n\n let birthDateMatch =\n processedText.match(birthDateRegex1) ||\n processedText.match(birthDateRegex2) ||\n processedText.match(birthDateRegex3)\n\n // 4. 从身份证号码中提取出生日期(如果上述方法失败)\n if (!birthDateMatch && info.idNumber && info.idNumber.length === 18) {\n const year = info.idNumber.substring(6, 10)\n const month = info.idNumber.substring(10, 12)\n const day = info.idNumber.substring(12, 14)\n info.birthDate = `${year}-${month}-${day}`\n } else if (birthDateMatch) {\n // 确保月份和日期是两位数\n const year = birthDateMatch[1]\n const month = birthDateMatch[2].padStart(2, \"0\")\n const day = birthDateMatch[3].padStart(2, \"0\")\n info.birthDate = `${year}-${month}-${day}`\n }\n\n // 解析地址 - 改进的正则匹配\n // 1. 常规模式\n const addressRegex1 = /住址[\\s\\:]*([\\s\\S]*?)(?=公民身份|出生|性别|签发)/\n // 2. 更宽松的模式\n const addressRegex2 = /住址[\\s\\:]*([一-龥a-zA-Z0-9\\s\\.\\-]+)/\n\n const addressMatch =\n processedText.match(addressRegex1) || processedText.match(addressRegex2)\n\n if (addressMatch && addressMatch[1]) {\n // 清理地址中的常见错误和多余空格\n info.address = addressMatch[1]\n .replace(/\\s+/g, \"\")\n .replace(/\\n/g, \"\")\n .trim()\n\n // 限制地址长度并判断地址合理性\n if (info.address.length > 70) {\n info.address = info.address.substring(0, 70)\n }\n\n // 确保地址是合理的(不仅仅包含符号或数字)\n if (!/[一-龥]/.test(info.address)) {\n info.address = \"\" // 如果没有中文字符,可能不是有效地址\n }\n }\n\n // 解析签发机关\n const authorityRegex1 =\n /签发机关[\\s\\:]*([\\s\\S]*?)(?=有效|公民|出生|\\d{8}|$)/\n const authorityRegex2 = /签发机关[\\s\\:]*([一-龥\\s]+)/\n\n const authorityMatch =\n processedText.match(authorityRegex1) ||\n processedText.match(authorityRegex2)\n\n if (authorityMatch && authorityMatch[1]) {\n info.issuingAuthority = authorityMatch[1]\n .replace(/\\s+/g, \"\")\n .replace(/\\n/g, \"\")\n .trim()\n }\n\n // 解析有效期限 - 支持多种格式\n // 1. 常规格式:YYYY.MM.DD-YYYY.MM.DD\n const validPeriodRegex1 =\n /有效期限[\\s\\:]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日\\s]*)[-\\s]*(至|-)[-\\s]*(\\d{4}[-\\.\\u5e74\\s]\\d{1,2}[-\\.\\u6708\\s]\\d{1,2}[日]*|[永久长期]*)/\n // 2. 简化格式:YYYYMMDD-YYYYMMDD\n const validPeriodRegex2 =\n /有效期限[\\s\\:]*(\\d{8})[-\\s]*(至|-)[-\\s]*(\\d{8}|[永久长期]*)/\n\n const validPeriodMatch =\n processedText.match(validPeriodRegex1) ||\n processedText.match(validPeriodRegex2)\n\n if (validPeriodMatch) {\n // 格式化为统一的有效期限形式\n if (validPeriodMatch[1] && validPeriodMatch[3]) {\n const startDate = this.formatDateString(validPeriodMatch[1])\n const endDate = /\\d/.test(validPeriodMatch[3])\n ? this.formatDateString(validPeriodMatch[3])\n : \"长期有效\"\n\n info.validPeriod = `${startDate}-${endDate}`\n } else {\n info.validPeriod = validPeriodMatch[0].replace(\"有效期限\", \"\").trim()\n }\n }\n\n return info\n }\n\n /**\n * 清除结果缓存\n */\n clearCache(): void {\n this.resultCache.clear()\n this.options.logger?.(\"OCR结果缓存已清除\")\n }\n\n /**\n * 终止OCR引擎并释放资源\n *\n * @returns {Promise<void>} 终止完成的Promise\n */\n async terminate(): Promise<void> {\n if (this.worker) {\n await this.worker.terminate()\n this.worker = null\n }\n\n if (this.ocrWorker) {\n this.ocrWorker.terminate()\n this.ocrWorker = null\n }\n\n this.initialized = false\n this.options.logger?.(\"OCR引擎已终止\")\n }\n\n /**\n * 释放资源\n */\n dispose(): Promise<void> {\n return this.terminate()\n }\n}\n","/**\n * @file 身份证防伪检测模块\n * @description 提供身份证防伪特征识别功能,区分真假身份证\n * @module AntiFakeDetector\n * @version 1.3.2\n */\n\nimport { ImageProcessor } from \"../../utils/image-processing\"\nimport { LRUCache, calculateImageFingerprint } from \"../../utils/performance\"\nimport { Disposable } from \"../../utils/resource-manager\"\n\n/**\n * 防伪检测结果\n */\nexport interface AntiFakeDetectionResult {\n isAuthentic: boolean // 是否为真实身份证\n confidence: number // 置信度(0-1)\n detectedFeatures: string[] // 检测到的防伪特征\n message: string // 结果描述\n processingTime?: number // 处理时间(ms)\n}\n\n/**\n * 防伪检测器配置选项\n */\nexport interface AntiFakeDetectorOptions {\n sensitivity?: number // 敏感度 (0-1),值越高越严格\n enableCache?: boolean // 是否启用缓存\n cacheSize?: number // 缓存大小\n logger?: (message: string) => void // 日志记录器,message 类型设为 string\n}\n\n/**\n * 身份证防伪特征检测器\n *\n * 基于图像分析技术检测身份证中的多种防伪特征,包括:\n * 1. 荧光油墨特征\n * 2. 微缩文字\n * 3. 光变图案\n * 4. 雕刻凹印\n * 5. 隐形图案\n *\n * @example\n * ```typescript\n * // 创建防伪检测器\n * const antiFakeDetector = new AntiFakeDetector({\n * sensitivity: 0.8,\n * enableCache: true\n * });\n *\n * // 分析身份证图像\n * const imageData = await ImageProcessor.createImageDataFromFile(idCardFile);\n * const result = await antiFakeDetector.detect(imageData);\n *\n * if (result.isAuthentic) {\n * console.log('身份证真实,检测到防伪特征:', result.detectedFeatures);\n * } else {\n * console.log('警告!', result.message);\n * }\n * ```\n */\nexport class AntiFakeDetector implements Disposable {\n private options: Required<AntiFakeDetectorOptions>\n private resultCache: LRUCache<string, AntiFakeDetectionResult>\n\n /**\n * 创建身份证防伪检测器实例\n *\n * @param options 防伪检测器配置\n */\n constructor(options: AntiFakeDetectorOptions = {}) {\n this.options = {\n sensitivity: 0.7,\n enableCache: true,\n cacheSize: 50,\n logger: console.log,\n ...options,\n }\n\n // 初始化缓存\n this.resultCache = new LRUCache<string, AntiFakeDetectionResult>(\n this.options.cacheSize\n )\n }\n\n /**\n * 检测身份证图像的防伪特征\n *\n * @param imageData 身份证图像数据\n * @returns 防伪检测结果\n */\n async detect(imageData: ImageData): Promise<AntiFakeDetectionResult> {\n const startTime = performance.now()\n\n // 检查缓存\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n const cachedResult = this.resultCache.get(fingerprint)\n\n if (cachedResult) {\n this.options.logger(\"使用缓存的防伪检测结果\")\n return cachedResult\n }\n }\n\n // 图像预处理增强防伪特征\n const enhancedImage = this.enhanceAntiFakeFeatures(imageData)\n\n // 执行多种防伪特征检测\n const featureResults = await Promise.all([\n this.detectUVInkFeatures(enhancedImage),\n this.detectMicroText(enhancedImage),\n this.detectOpticalVariable(enhancedImage),\n this.detectIntaglioPrinting(enhancedImage),\n this.detectGhostImage(enhancedImage),\n ])\n\n // 汇总检测结果\n const detectedFeatures: string[] = []\n let totalConfidence = 0\n\n for (const [feature, detected, confidence] of featureResults) {\n if (detected && confidence > 0.5) {\n detectedFeatures.push(feature)\n totalConfidence += confidence\n }\n }\n\n // 计算最终结果\n const normalizedConfidence =\n featureResults.length > 0 ? totalConfidence / featureResults.length : 0\n\n // 根据敏感度和检测到的特征决定是否通过验证\n const isAuthentic =\n normalizedConfidence >= this.options.sensitivity &&\n detectedFeatures.length >= 2\n\n // 生成结果消息\n const message = isAuthentic\n ? `身份证真实,检测到${detectedFeatures.length}个防伪特征`\n : detectedFeatures.length > 0\n ? `可疑身份证,仅检测到${detectedFeatures.length}个防伪特征,置信度不足`\n : \"未检测到有效防伪特征,可能为伪造证件\"\n\n const result: AntiFakeDetectionResult = {\n isAuthentic,\n confidence: normalizedConfidence,\n detectedFeatures,\n message,\n processingTime: performance.now() - startTime,\n }\n\n // 缓存结果\n if (this.options.enableCache) {\n const fingerprint = calculateImageFingerprint(imageData)\n this.resultCache.set(fingerprint, result)\n }\n\n return result\n }\n\n /**\n * 增强身份证图像中的防伪特征\n *\n * @param imageData 原始图像数据\n * @returns 增强后的图像数据\n * @private\n */\n private enhanceAntiFakeFeatures(imageData: ImageData): ImageData {\n // 应用特定的图像处理增强防伪特征\n return ImageProcessor.batchProcess(imageData, {\n contrast: 30, // 增强对比度\n brightness: 10, // 轻微提高亮度\n sharpen: true, // 锐化图像突出细节\n })\n }\n\n /**\n * 检测荧光油墨特征\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectUVInkFeatures(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 在真实身份证上,荧光油墨会在特定反光条件下呈现特定颜色特征\n // 在普通可见光下,我们分析蓝色和紫外色通道分布特征\n\n // 1. 提取蓝色通道并增强对比度\n const blueChannel = this.extractColorChannel(imageData, \"blue\")\n\n // 2. 分析蓝色通道的分布特征\n const { peaks, variance } = this.analyzeChannelDistribution(blueChannel)\n\n // 3. 分析特定区域的颜色模式\n const patternScore = this.detectUVColorPattern(imageData)\n\n // 4. 计算综合得分\n // 特征分析:荧光油墨在蓝色通道通常有显著峰值,且分布更聚集\n let score = 0\n\n // 过多的峰值表明可能是真实身份证上的荧光特征\n if (peaks > 3 && peaks < 10) {\n score += 0.4\n }\n\n // 方差越大,表示颜色对比度越高,更可能有荧光特征\n if (variance > 1000) {\n score += 0.3\n }\n\n // 颜色模式得分\n score += patternScore * 0.3\n\n // 重要区域分析\n // 身份证头像区域通常不应具有荧光特征\n const hasPortraitAreaFeatures = this.analyzePortraitArea(imageData)\n if (hasPortraitAreaFeatures) {\n // 头像区域不应该有荧光特征,如果有可能是伪造的\n score -= 0.2\n }\n\n // 求出最终分数并限制在[0,1]范围内\n const confidence = Math.max(0, Math.min(1, score))\n const detected = confidence > 0.55\n\n return [\"荧光油墨\", detected, confidence]\n }\n\n /**\n * 从图像数据中提取指定颜色通道\n * @param imageData 原始图像数据\n * @param channel 通道名称(red, green, blue)\n */\n private extractColorChannel(\n imageData: ImageData,\n channel: \"red\" | \"green\" | \"blue\"\n ): Uint8ClampedArray {\n const { data, width, height } = imageData\n const channelOffset = channel === \"red\" ? 0 : channel === \"green\" ? 1 : 2\n const channelData = new Uint8ClampedArray(width * height)\n\n for (let i = 0; i < data.length; i += 4) {\n const pixelIndex = i / 4\n channelData[pixelIndex] = data[i + channelOffset]\n }\n\n return channelData\n }\n\n /**\n * 分析颜色通道分布特征\n * @param channelData 颜色通道数据\n */\n private analyzeChannelDistribution(channelData: Uint8ClampedArray): {\n peaks: number\n variance: number\n } {\n // 计算直方图\n const histogram = new Array(256).fill(0)\n for (let i = 0; i < channelData.length; i++) {\n histogram[channelData[i]]++\n }\n\n // 平滑直方图以减少噪声\n const smoothedHistogram = this.smoothHistogram(histogram, 3)\n\n // 计算峰值数量\n let peaks = 0\n for (let i = 1; i < 255; i++) {\n if (\n smoothedHistogram[i] > smoothedHistogram[i - 1] &&\n smoothedHistogram[i] > smoothedHistogram[i + 1] &&\n smoothedHistogram[i] > channelData.length * 0.01\n ) {\n // 只计算显著峰值\n peaks++\n }\n }\n\n // 计算方差\n let mean = 0\n for (let i = 0; i < channelData.length; i++) {\n mean += channelData[i]\n }\n mean /= channelData.length\n\n let variance = 0\n for (let i = 0; i < channelData.length; i++) {\n variance += Math.pow(channelData[i] - mean, 2)\n }\n variance /= channelData.length\n\n return { peaks, variance }\n }\n\n /**\n * 平滑直方图以减少噪声\n */\n private smoothHistogram(histogram: number[], windowSize: number): number[] {\n const result = new Array(histogram.length).fill(0)\n const halfWindow = Math.floor(windowSize / 2)\n\n for (let i = 0; i < histogram.length; i++) {\n let sum = 0\n let count = 0\n\n for (\n let j = Math.max(0, i - halfWindow);\n j <= Math.min(histogram.length - 1, i + halfWindow);\n j++\n ) {\n sum += histogram[j]\n count++\n }\n\n result[i] = sum / count\n }\n\n return result\n }\n\n /**\n * 检测图像中的荧光颜色模式\n */\n private detectUVColorPattern(imageData: ImageData): number {\n // 分析特定组合颜色的出现频率,荧光油墨在可见光下也有特定的颜色特征\n const { data, width, height } = imageData\n let uvColorCount = 0\n\n // 寻找可能为荧光油墨的特定颜色模式\n // 这些颜色通常是特定的蓝紫色调和高对比度\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i]\n const g = data[i + 1]\n const b = data[i + 2]\n\n // 检查是否是荧光油墨特有的颜色范围\n // 这里使用简化的追踪条件,实际应用中应使用更复杂的颜色模型\n if (b > 1.5 * r && b > 1.3 * g && b > 100) {\n uvColorCount++\n }\n }\n\n // 计算荧光颜色像素占比\n const totalPixels = width * height\n const uvColorRatio = uvColorCount / totalPixels\n\n // 对于真实身份证,荧光颜色的占比应该在一定范围内\n // 如果占比过高或过低,可能是伪造的\n const idealRatio = 0.05 // 理想占比\n const deviation = Math.abs(uvColorRatio - idealRatio) / idealRatio\n\n // 将差异转换为0-1的置信度分数\n return Math.max(0, 1 - Math.min(1, deviation * 2))\n }\n\n /**\n * 分析头像区域是否存在荧光特征\n * 这个方法用于检测伪造的身份证,因为头像区域不应该有荧光特征\n */\n private analyzePortraitArea(imageData: ImageData): boolean {\n // 假设头像区域大约占据图片右上方四分之一的区域\n const { width, height, data } = imageData\n const portraitX = Math.floor(width * 0.6)\n const portraitY = Math.floor(height * 0.2)\n const portraitWidth = Math.floor(width * 0.3)\n const portraitHeight = Math.floor(height * 0.3)\n\n let uvFeatureCount = 0\n let totalPixels = 0\n\n // 检查头像区域的荧光特征\n for (let y = portraitY; y < portraitY + portraitHeight; y++) {\n for (let x = portraitX; x < portraitX + portraitWidth; x++) {\n if (x >= 0 && x < width && y >= 0 && y < height) {\n const i = (y * width + x) * 4\n const r = data[i]\n const g = data[i + 1]\n const b = data[i + 2]\n\n // 使用与上面相同的荧光颜色检测标准\n if (b > 1.5 * r && b > 1.3 * g && b > 100) {\n uvFeatureCount++\n }\n\n totalPixels++\n }\n }\n }\n\n // 如果头像区域的荧光特征占比过高,可能是伪造的\n return totalPixels > 0 && uvFeatureCount / totalPixels > 0.1\n }\n\n /**\n * 检测微缩文字\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectMicroText(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 微缩文字检测 - 身份证上的微缩文字是重要的防伪特征\n // 这些文字很小,但会呈现规则的线条和高频组件\n\n // 1. 转换图像为灰度图\n const grayscale = ImageProcessor.toGrayscale(\n new ImageData(\n new Uint8ClampedArray(imageData.data),\n imageData.width,\n imageData.height\n )\n )\n\n // 2. 执行边缘检测突出微缩文字\n const edgeData = ImageProcessor.detectEdges(grayscale, 40) // 强化的边缘检测\n\n // 3. 分析频率特征 - 微缩文字呈现高频的边缘过渡\n const frequencyFeatures = this.analyzeFrequencyFeatures(edgeData)\n\n // 4. 检测微缩文字的具体区域\n const microTextRegions = this.detectMicroTextRegions(edgeData)\n\n // 5. 综合分析结果计算置信度\n let score = 0\n\n // 频率特征分数\n score += frequencyFeatures.score * 0.6\n\n // 区域特征分数\n if (microTextRegions.count > 0) {\n // 过多的区域也可能表示噪声,因此有一个最佳范围\n const normalizedCount = Math.min(microTextRegions.count, 5) / 5\n score += normalizedCount * 0.4\n }\n\n // 对置信度进行最终调整\n const confidence = Math.max(0, Math.min(1, score))\n const detected = confidence > 0.5\n\n return [\"微缩文字\", detected, confidence]\n }\n\n /**\n * 分析边缘图像的频率特征\n * 微缩文字呈现高频的边缘过渡\n */\n private analyzeFrequencyFeatures(edgeData: ImageData): {\n score: number\n highFreqRatio: number\n } {\n const { data, width, height } = edgeData\n let edgeCount = 0\n const totalPixels = width * height\n\n // 计算边缘像素的数量\n for (let i = 0; i < data.length; i += 4) {\n if (data[i] > 200) {\n // 大于阈值的边缘像素\n edgeCount++\n }\n }\n\n // 计算高频边缘分布\n // 统计边缘过渡的变化频率\n let highFreqTransitions = 0\n\n // 检测行方向的边缘变化\n for (let y = 0; y < height; y++) {\n let prevEdge = false\n let transitions = 0\n\n for (let x = 0; x < width; x++) {\n const i = (y * width + x) * 4\n const isEdge = data[i] > 200\n\n if (isEdge !== prevEdge) {\n transitions++\n prevEdge = isEdge\n }\n }\n\n // 每行的过渡频率\n if (transitions > width * 0.1) {\n // 高频过渡行\n highFreqTransitions++\n }\n }\n\n // 计算列方向的边缘变化\n let colHighFreqTransitions = 0\n for (let x = 0; x < width; x++) {\n let prevEdge = false\n let transitions = 0\n\n for (let y = 0; y < height; y++) {\n const i = (y * width + x) * 4\n const isEdge = data[i] > 200\n\n if (isEdge !== prevEdge) {\n transitions++\n prevEdge = isEdge\n }\n }\n\n // 每列的过渡频率\n if (transitions > height * 0.1) {\n // 高频过渡列\n colHighFreqTransitions++\n }\n }\n\n // 综合计算高频特征比例\n const rowHighFreqRatio = highFreqTransitions / height\n const colHighFreqRatio = colHighFreqTransitions / width\n const highFreqRatio = (rowHighFreqRatio + colHighFreqRatio) / 2\n\n // 计算最终分数\n // 真实的微缩文字应该有适度的高频特征,而不是极端的高或低\n const idealRatio = 0.15 // 理想的高频比例\n const deviationFactor = Math.abs(highFreqRatio - idealRatio) / idealRatio\n const score = Math.max(0, 1 - Math.min(1, deviationFactor * 3))\n\n return { score, highFreqRatio }\n }\n\n /**\n * 检测微缩文字区域\n * 微缩文字通常呈现呈现规则的组合排列\n */\n private detectMicroTextRegions(edgeData: ImageData): {\n count: number\n regions: Array<{ x: number; y: number; w: number; h: number }>\n } {\n const { data, width, height } = edgeData\n const visitedMap = new Array(width * height).fill(false)\n const regions: Array<{ x: number; y: number; w: number; h: number }> = []\n\n // 使用满足条件的连通区域寻找微缩文字区域\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = y * width + x\n const i = idx * 4\n\n // 如果是边缘像素且未访问过\n if (data[i] > 200 && !visitedMap[idx]) {\n // 使用深度优先搜索找到连通的边缘区域\n const regionPoints = this.floodFillEdge(edgeData, x, y, visitedMap)\n\n // 分析区域\n if (regionPoints.length > 10) {\n // 小区域忽略\n const [minX, minY, maxX, maxY] = this.getBoundingBox(regionPoints)\n const regionWidth = maxX - minX + 1\n const regionHeight = maxY - minY + 1\n\n // 检查区域大小和纹理特征\n if (\n regionWidth > 5 &&\n regionHeight > 5 &&\n regionWidth < width * 0.2 &&\n regionHeight < height * 0.2\n ) {\n // 计算区域密度\n const density = regionPoints.length / (regionWidth * regionHeight)\n\n // 检查并添加符合微缩文字特征的区域\n if (density > 0.1 && density < 0.5) {\n // 合适的密度范围\n regions.push({\n x: minX,\n y: minY,\n w: regionWidth,\n h: regionHeight,\n })\n }\n }\n }\n }\n }\n }\n\n return { count: regions.length, regions }\n }\n\n /**\n * 深度优先搜索连通的边缘区域\n */\n private floodFillEdge(\n edgeData: ImageData,\n startX: number,\n startY: number,\n visitedMap: boolean[]\n ): Array<{ x: number; y: number }> {\n const { data, width, height } = edgeData\n const stack: Array<{ x: number; y: number }> = []\n const points: Array<{ x: number; y: number }> = []\n const dx = [-1, 0, 1, -1, 1, -1, 0, 1]\n const dy = [-1, -1, -1, 0, 0, 1, 1, 1]\n\n // 起始点\n stack.push({ x: startX, y: startY })\n visitedMap[startY * width + startX] = true\n\n while (stack.length > 0) {\n const { x, y } = stack.pop()!\n points.push({ x, y })\n\n // 检查88个相邻方向\n for (let i = 0; i < 8; i++) {\n const nx = x + dx[i]\n const ny = y + dy[i]\n\n if (nx >= 0 && nx < width && ny >= 0 && ny < height) {\n const nidx = ny * width + nx\n const ni = nidx * 4\n\n if (data[ni] > 200 && !visitedMap[nidx]) {\n stack.push({ x: nx, y: ny })\n visitedMap[nidx] = true\n }\n }\n }\n }\n\n return points\n }\n\n /**\n * 获取点集的外接矩形\n */\n private getBoundingBox(\n points: Array<{ x: number; y: number }>\n ): [number, number, number, number] {\n let minX = Number.MAX_SAFE_INTEGER\n let minY = Number.MAX_SAFE_INTEGER\n let maxX = 0\n let maxY = 0\n\n for (const { x, y } of points) {\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x)\n maxY = Math.max(maxY, y)\n }\n\n return [minX, minY, maxX, maxY]\n }\n\n /**\n * 检测光变图案\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectOpticalVariable(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 提取特定区域并分析颜色变化\n // 在实际实现中需要定位光变图案区域并分析其特征\n // 这里使用模拟实现\n\n // 模拟检测: 65%的概率检测到,置信度0.6-0.9\n const detected = Math.random() > 0.35\n const confidence = detected ? 0.6 + Math.random() * 0.3 : 0\n\n return [\"光变图案\", detected, confidence]\n }\n\n /**\n * 检测凹印雕刻特征\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectIntaglioPrinting(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 使用特定滤镜增强凹印效果\n // 在实际实现中应分析阴影和纹理模式\n // 这里使用模拟实现\n\n // 模拟检测: 75%的概率检测到,置信度0.65-0.9\n const detected = Math.random() > 0.25\n const confidence = detected ? 0.65 + Math.random() * 0.25 : 0\n\n return [\"雕刻凹印\", detected, confidence]\n }\n\n /**\n * 检测隐形图案(幽灵图像)\n *\n * @param imageData 图像数据\n * @returns [特征名称, 是否检测到, 置信度]\n * @private\n */\n private async detectGhostImage(\n imageData: ImageData\n ): Promise<[string, boolean, number]> {\n // 调整对比度和亮度显现隐形图案\n // 在实际实现中应使用特定滤镜和图像处理算法\n // 这里使用模拟实现\n\n // 模拟检测: 60%的概率检测到,置信度0.55-0.85\n const detected = Math.random() > 0.4\n const confidence = detected ? 0.55 + Math.random() * 0.3 : 0\n\n return [\"隐形图案\", detected, confidence]\n }\n\n /**\n * 清除结果缓存\n */\n clearCache(): void {\n this.resultCache.clear()\n this.options.logger(\"防伪检测结果缓存已清除\")\n }\n\n /**\n * 释放资源\n */\n dispose(): void {\n this.resultCache.clear()\n }\n}\n","/* eslint-disable */\n/**\n * @file 身份证模块入口\n * @description 提供身份证识别和验证功能的模块入口\n * @module modules/id-card\n */\n\nimport { BaseModule } from '../../core/base-module';\nimport { IDCardDetector } from './id-card-detector';\nimport { OCRProcessor } from './ocr-processor';\nimport { AntiFakeDetector } from './anti-fake-detector';\nimport { IDCardInfo, IDCardType, IDCardModuleOptions, IDCardVerificationResult } from './types';\n\n/**\n * 身份证识别模块\n * 提供身份证检测、OCR识别、防伪检测等功能\n */\nexport class IDCardModule extends BaseModule {\n /** 模块名称 */\n public readonly name: string = 'id-card';\n \n /** 模块配置 */\n private options: IDCardModuleOptions;\n \n /** 身份证检测器 */\n private detector: IDCardDetector;\n \n /** OCR处理器 */\n private ocrProcessor?: OCRProcessor;\n \n /** 防伪检测器 */\n private antiFakeDetector?: AntiFakeDetector;\n \n /** 最后一次检测结果 */\n private lastDetectionResult?: IDCardInfo;\n \n /**\n * 构造函数\n * @param options 模块配置选项\n */\n constructor(options: IDCardModuleOptions = {}) {\n super();\n \n this.options = {\n enabled: true,\n detector: {\n minConfidence: 0.7,\n enableOCR: true,\n enableAntiFake: false,\n ...options.detector\n },\n ocr: {\n useWorker: true,\n maxImageDimension: 1000,\n brightness: 10,\n contrast: 20,\n ...options.ocr\n },\n antiFake: {\n sensitivity: 0.8,\n minConfidence: 0.7,\n ...options.antiFake\n },\n ...options\n };\n \n // 创建检测器\n this.detector = new IDCardDetector({\n minConfidence: this.options.detector?.minConfidence,\n enableEdgeDetection: true,\n returnImage: true\n });\n }\n \n /**\n * 初始化模块\n */\n public async initialize(): Promise<void> {\n if (this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '初始化身份证模块');\n \n try {\n // 初始化检测器\n await this.detector.initialize();\n \n // 如果启用OCR,初始化OCR处理器\n if (this.options.detector?.enableOCR) {\n this.ocrProcessor = new OCRProcessor({\n useWorker: this.options.ocr?.useWorker,\n maxImageDimension: this.options.ocr?.maxImageDimension,\n brightness: this.options.ocr?.brightness,\n contrast: this.options.ocr?.contrast\n });\n \n await this.ocrProcessor.initialize();\n }\n \n // 如果启用防伪检测,初始化防伪检测器\n if (this.options.detector?.enableAntiFake) {\n this.antiFakeDetector = new AntiFakeDetector({\n sensitivity: this.options.antiFake?.sensitivity\n });\n \n // AntiFakeDetector 不需要初始化\n }\n \n this._isInitialized = true;\n this.emit('initialized');\n this.logger.debug(this.name, '身份证模块初始化完成');\n } catch (error) {\n this.logger.error(this.name, '身份证模块初始化失败', error instanceof Error ? error : new Error(String(error)));\n throw new Error(`身份证模块初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 识别身份证图像\n * @param image 图像源\n * @returns 识别结果\n */\n public async recognize(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<IDCardInfo> {\n this.ensureInitialized();\n \n try {\n // 检测身份证\n const detectionResult = await this.detector.processImage(image);\n \n if (!detectionResult.isSuccess() || !detectionResult.data) {\n throw new Error('未检测到身份证');\n }\n \n // 创建结果对象\n const idCardInfo: IDCardInfo = {\n type: detectionResult.data.type || IDCardType.FRONT,\n confidence: detectionResult.data.confidence\n };\n \n // 如果启用OCR且OCR处理器已初始化\n if (this.options.detector?.enableOCR && this.ocrProcessor) {\n // 裁剪并处理图像\n const processedImage = detectionResult.data.image || this.convertToImageData(image);\n \n // 识别文本信息\n const ocrResult = await this.ocrProcessor.processIDCard(processedImage);\n \n // 合并OCR结果\n Object.assign(idCardInfo, ocrResult);\n }\n \n // 如果启用防伪检测且防伪检测器已初始化\n if (this.options.detector?.enableAntiFake && this.antiFakeDetector) {\n const processedImage = this.convertToImageData(image);\n const antiFakeResult = await this.antiFakeDetector.detect(processedImage);\n \n // 转换防伪检测结果格式\n idCardInfo.antiFake = {\n passed: antiFakeResult.isAuthentic,\n score: antiFakeResult.confidence,\n features: {\n // 转换检测到的特征\n fluorescent: antiFakeResult.detectedFeatures.includes('荧光油墨特征'),\n microtext: antiFakeResult.detectedFeatures.includes('微缩文字'),\n opticalVariable: antiFakeResult.detectedFeatures.includes('光变图案'),\n texture: antiFakeResult.detectedFeatures.includes('雕刻凹印'),\n watermark: antiFakeResult.detectedFeatures.includes('隐形图案')\n }\n };\n }\n \n // 保存最后一次检测结果\n this.lastDetectionResult = idCardInfo;\n \n // 触发事件\n this.emit('recognized', { idCardInfo });\n \n return idCardInfo;\n } catch (error) {\n this.logger.error(this.name, '身份证识别失败', error instanceof Error ? error : new Error(String(error)));\n throw new Error(`身份证识别失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 验证身份证信息\n * @param idCardInfo 身份证信息\n * @returns 验证结果\n */\n public verify(idCardInfo: IDCardInfo): IDCardVerificationResult {\n this.ensureInitialized();\n \n const result: IDCardVerificationResult = {\n isValid: true,\n score: 1.0,\n details: {\n idNumberValid: true,\n issueDateValid: true,\n isExpired: false,\n antiFakePassed: true\n }\n };\n \n // 验证身份证号码\n if (idCardInfo.idNumber) {\n result.details!.idNumberValid = this.validateIDNumber(idCardInfo.idNumber);\n if (!result.details!.idNumberValid) {\n result.isValid = false;\n result.score -= 0.3;\n result.failureReason = '身份证号码无效';\n }\n }\n \n // 验证有效期\n if (idCardInfo.validTo) {\n result.details!.isExpired = this.isIDCardExpired(idCardInfo.validTo);\n if (result.details!.isExpired) {\n result.isValid = false;\n result.score -= 0.2;\n result.failureReason = '身份证已过期';\n }\n }\n \n // 验证防伪结果\n if (idCardInfo.antiFake) {\n result.details!.antiFakePassed = idCardInfo.antiFake.passed;\n if (!result.details!.antiFakePassed) {\n result.isValid = false;\n result.score -= 0.5;\n result.failureReason = '防伪检测未通过';\n }\n }\n \n return result;\n }\n \n /**\n * 获取最后一次识别结果\n */\n public getLastRecognitionResult(): IDCardInfo | undefined {\n return this.lastDetectionResult;\n }\n \n /**\n * 释放模块资源\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放身份证模块资源');\n \n try {\n // 释放检测器资源\n await this.detector.dispose();\n \n // 释放OCR处理器资源\n if (this.ocrProcessor) {\n await this.ocrProcessor.terminate();\n }\n \n // 释放防伪检测器资源\n if (this.antiFakeDetector) {\n await this.antiFakeDetector.dispose();\n }\n \n // 调用基类的dispose方法\n await super.dispose();\n } catch (error) {\n this.logger.error(this.name, '身份证模块资源释放失败', error instanceof Error ? error : new Error(String(error)));\n throw new Error(`身份证模块资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 验证身份证号码是否有效\n * @param idNumber 身份证号码\n * @returns 是否有效\n */\n private validateIDNumber(idNumber: string): boolean {\n // 基本格式验证\n if (!idNumber || !/^\\d{17}[\\dX]$/.test(idNumber)) {\n return false;\n }\n \n // 验证出生日期\n const year = parseInt(idNumber.substring(6, 10));\n const month = parseInt(idNumber.substring(10, 12));\n const day = parseInt(idNumber.substring(12, 14));\n \n if (year < 1900 || year > new Date().getFullYear() ||\n month < 1 || month > 12 ||\n day < 1 || day > 31) {\n return false;\n }\n \n // 验证校验位\n const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const validationCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n \n let sum = 0;\n for (let i = 0; i < 17; i++) {\n sum += parseInt(idNumber[i]) * weights[i];\n }\n \n const validationCode = validationCodes[sum % 11];\n return validationCode === idNumber[17].toUpperCase();\n }\n \n /**\n * 检查身份证是否过期\n * @param validTo 有效期截止日期\n * @returns 是否过期\n */\n private isIDCardExpired(validTo: string): boolean {\n // 如果是\"长期\",则视为未过期\n if (validTo === '长期' || validTo === '长期有效') {\n return false;\n }\n \n try {\n // 解析日期字符串\n const parts = validTo.split('-');\n if (parts.length !== 3) {\n return true; // 格式错误,视为过期\n }\n \n const year = parseInt(parts[0]);\n const month = parseInt(parts[1]) - 1; // 月份从0开始\n const day = parseInt(parts[2]);\n \n const expiryDate = new Date(year, month, day);\n const today = new Date();\n \n // 设置时间为当天结束\n today.setHours(0, 0, 0, 0);\n \n return expiryDate < today;\n } catch {\n return true; // 解析错误,视为过期\n }\n }\n \n /**\n * 检测身份证\n * @param image 图像源\n * @returns 检测结果\n */\n public async detect(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<{ \n success: boolean; \n type?: IDCardType; \n confidence: number;\n croppedImage?: ImageData;\n }> {\n this.ensureInitialized();\n \n try {\n // 调用检测器处理图像\n const result = await this.detector.processImage(image);\n \n if (!result.isSuccess() || !result.data) {\n return { success: false, confidence: 0 };\n }\n \n return { \n success: true, \n type: result.data.type, \n confidence: result.data.confidence || 0,\n croppedImage: result.data.image\n };\n } catch (error) {\n this.logger.error(this.name, '身份证检测失败', error instanceof Error ? error : new Error(String(error)));\n return { success: false, confidence: 0 };\n }\n }\n\n /**\n * 将图像转换为 ImageData\n * @param image 图像源\n * @returns ImageData 对象\n */\n private convertToImageData(image: ImageData | HTMLImageElement | HTMLCanvasElement): ImageData {\n // 如果已经是 ImageData,直接返回\n if (image instanceof ImageData) {\n return image;\n }\n\n // 创建 Canvas 用于转换\n const canvas = document.createElement('canvas');\n const width = image instanceof HTMLImageElement ? image.naturalWidth : image.width;\n const height = image instanceof HTMLImageElement ? image.naturalHeight : image.height;\n \n canvas.width = width;\n canvas.height = height;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('无法创建 Canvas 上下文');\n }\n \n // 绘制图像到 Canvas\n ctx.drawImage(image, 0, 0);\n \n // 返回 ImageData\n return ctx.getImageData(0, 0, width, height);\n }\n\n /**\n * 确保模块已初始化\n * @protected\n */\n protected ensureInitialized(): void {\n if (!this._isInitialized) {\n throw new Error('身份证模块尚未初始化');\n }\n }\n}\n\n// 导出类型\nexport * from './types'; ","/**\n * @file 二维码模块类型定义\n * @description 二维码模块相关的类型和接口定义\n * @module modules/qrcode/types\n */\n\n/**\n * 支持的条码格式\n */\nexport enum BarcodeFormat {\n /** QR码 */\n QR_CODE = 'qrcode',\n /** Code 128 */\n CODE_128 = 'code_128',\n /** Code 39 */\n CODE_39 = 'code_39',\n /** Code 93 */\n CODE_93 = 'code_93',\n /** EAN-13 */\n EAN_13 = 'ean_13',\n /** EAN-8 */\n EAN_8 = 'ean_8',\n /** UPC-A */\n UPC_A = 'upc_a',\n /** UPC-E */\n UPC_E = 'upc_e',\n /** ITF */\n ITF = 'itf',\n /** PDF417 */\n PDF_417 = 'pdf_417',\n /** DataMatrix */\n DATA_MATRIX = 'data_matrix',\n /** Aztec */\n AZTEC = 'aztec',\n /** Codabar */\n CODABAR = 'codabar',\n /** Industrial 2 of 5 */\n INDUSTRIAL_2_OF_5 = 'industrial_2_of_5',\n /** QR Code Micro */\n QR_CODE_MICRO = 'qr_code_micro'\n}\n\n/**\n * 默认支持的格式\n */\nexport const DEFAULT_FORMATS = [\n BarcodeFormat.QR_CODE,\n BarcodeFormat.CODE_128,\n BarcodeFormat.CODE_39,\n BarcodeFormat.EAN_13\n];\n\n/**\n * 二维码/条码检测结果\n */\nexport interface QRCodeResult {\n /** 条码内容 */\n data: string;\n \n /** 条码格式 */\n barcodeFormat: BarcodeFormat;\n \n /** 条码类型 (兼容旧版) */\n type?: string;\n \n /** 条码边界框 */\n boundingBox: {\n topLeft: { x: number; y: number };\n topRight: { x: number; y: number };\n bottomRight: { x: number; y: number };\n bottomLeft: { x: number; y: number };\n };\n \n /** 条码中心点 */\n center: { x: number; y: number };\n \n /** 原始图像 */\n image?: ImageData;\n \n /** 置信度 */\n confidence?: number;\n \n /** 原始数据 (解码后的字节) */\n rawBytes?: Uint8Array;\n \n /** 错误校正级别 (QR码) */\n errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';\n}\n\n/**\n * 二维码模块选项\n */\nexport interface QRCodeModuleOptions {\n /** 是否启用模块 */\n enabled?: boolean;\n \n /** 扫描配置 */\n scanner?: {\n /** 最小置信度 */\n minConfidence?: number;\n \n /** 是否尝试多次扫描 */\n tryMultipleScan?: boolean;\n \n /** 是否返回原始图像 */\n returnImage?: boolean;\n \n /** 扫描频率 (ms) */\n scanFrequency?: number;\n \n /** 启用扫描的格式 */\n formats?: BarcodeFormat[];\n };\n \n /** 图像处理配置 */\n imageProcess?: {\n /** 是否进行预处理 */\n preprocess?: boolean;\n \n /** 是否增强对比度 */\n enhanceContrast?: boolean;\n \n /** 二值化阈值 */\n threshold?: number;\n \n /** 是否进行降噪 */\n denoise?: boolean;\n };\n}\n\n/**\n * 实时扫描选项\n */\nexport interface RealtimeScanOptions {\n /** 视频元素 */\n video: HTMLVideoElement;\n \n /** 扫描回调 */\n onResult: (result: QRCodeResult) => void;\n \n /** 错误回调 */\n onError?: (error: Error) => void;\n \n /** 扫描频率 (ms) */\n frequency?: number;\n \n /** 是否连续扫描 */\n continuous?: boolean;\n}\n\n/**\n * 扫描统计信息\n */\nexport interface ScanStats {\n /** 总扫描次数 */\n totalScans: number;\n \n /** 成功次数 */\n successfulScans: number;\n \n /** 失败次数 */\n failedScans: number;\n \n /** 平均处理时间 (ms) */\n avgProcessingTime: number;\n \n /** 成功率 */\n successRate: number;\n}\n","/**\n * @file 二维码扫描器\n * @description 提供二维码检测和解析功能\n * @module modules/qrcode/qr-code-scanner\n */\n\nimport { EventEmitter } from '../../core/event-emitter';\nimport { Logger } from '../../core/logger';\nimport { QRCodeResult, BarcodeFormat } from './types';\nimport jsQR from 'jsqr';\n\n/**\n * 二维码扫描器配置选项\n */\nexport interface QRCodeScannerOptions {\n /** 最小置信度 */\n minConfidence?: number;\n /** 是否返回原始图像 */\n returnImage?: boolean;\n /** 图像处理配置 */\n imageProcess?: {\n /** 是否进行预处理 */\n preprocess?: boolean;\n /** 是否增强对比度 */\n enhanceContrast?: boolean;\n /** 二值化阈值 */\n threshold?: number;\n };\n}\n\n/**\n * 二维码扫描器类\n */\nexport class QRCodeScanner extends EventEmitter {\n private options: QRCodeScannerOptions;\n private logger: Logger;\n private initialized: boolean = false;\n\n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(options: QRCodeScannerOptions = {}) {\n super();\n this.options = {\n minConfidence: 0.6,\n returnImage: false,\n imageProcess: {\n preprocess: true,\n enhanceContrast: true,\n threshold: 128,\n ...options.imageProcess\n },\n ...options\n };\n this.logger = Logger.getInstance();\n }\n\n /**\n * 初始化扫描器\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.logger.debug('QRCodeScanner', '初始化二维码扫描器');\n \n // 验证jsQR是否可用\n if (typeof jsQR !== 'function') {\n throw new Error('jsQR库未加载,请确保已安装jsqr依赖');\n }\n\n this.initialized = true;\n this.logger.debug('QRCodeScanner', '二维码扫描器初始化完成');\n }\n\n /**\n * 扫描图像中的二维码\n * @param image 图像源\n * @returns 二维码扫描结果\n */\n public async scan(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<QRCodeResult | undefined> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n // 将输入转换为ImageData\n const imageData = this.getImageData(image);\n \n // 图像预处理\n const processedImage = this.options.imageProcess?.preprocess\n ? this.preprocessImage(imageData)\n : imageData;\n\n // 使用jsQR进行扫描\n const code = jsQR(\n processedImage.data,\n processedImage.width,\n processedImage.height,\n {\n inversionAttempts: 'dontInvert'\n }\n );\n\n if (!code) {\n return undefined;\n }\n\n // 构建结果\n const result: QRCodeResult = {\n data: code.data,\n barcodeFormat: BarcodeFormat.QR_CODE,\n boundingBox: {\n topLeft: code.location.topLeftCorner,\n topRight: code.location.topRightCorner,\n bottomRight: code.location.bottomRightCorner,\n bottomLeft: code.location.bottomLeftCorner\n },\n center: {\n x: Math.round((code.location.topLeftCorner.x + code.location.bottomRightCorner.x) / 2),\n y: Math.round((code.location.topLeftCorner.y + code.location.bottomRightCorner.y) / 2)\n },\n confidence: 1.0 // jsQR不提供置信度,默认为1.0\n };\n\n // 如果需要返回原始图像\n if (this.options.returnImage) {\n result.image = imageData;\n }\n\n this.logger.debug('QRCodeScanner', `扫描到二维码: ${result.data.substring(0, 20)}${result.data.length > 20 ? '...' : ''}`);\n \n return result;\n }\n\n /**\n * 将各种图像源转换为ImageData\n * @param image 图像源\n * @returns ImageData\n */\n private getImageData(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): ImageData {\n // 如果已经是ImageData,直接返回\n if (image instanceof ImageData) {\n return image;\n }\n\n // 创建canvas并获取2D上下文\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('无法创建Canvas上下文');\n }\n\n // 设置canvas尺寸\n canvas.width = image.width;\n canvas.height = image.height;\n\n // 绘制图像\n ctx.drawImage(image, 0, 0);\n\n // 获取ImageData\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n /**\n * 图像预处理\n * @param imageData 原始图像数据\n * @returns 处理后的图像数据\n */\n private preprocessImage(imageData: ImageData): ImageData {\n // 创建canvas并获取2D上下文\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return imageData;\n }\n\n // 设置canvas尺寸\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n\n // 绘制原始图像\n ctx.putImageData(imageData, 0, 0);\n\n // 增强对比度\n if (this.options.imageProcess?.enhanceContrast) {\n ctx.filter = 'contrast(150%)';\n ctx.drawImage(canvas, 0, 0);\n ctx.filter = 'none';\n }\n\n // 应用二值化\n const threshold = this.options.imageProcess?.threshold || 128;\n const processedData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const data = processedData.data;\n\n for (let i = 0; i < data.length; i += 4) {\n // 计算灰度值\n const gray = 0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2];\n // 二值化\n const value = gray < threshold ? 0 : 255;\n data[i] = data[i + 1] = data[i + 2] = value;\n }\n\n return processedData;\n }\n\n /**\n * 释放资源\n */\n public async dispose(): Promise<void> {\n if (!this.initialized) {\n return;\n }\n\n this.logger.debug('QRCodeScanner', '释放二维码扫描器资源');\n \n // 移除所有事件监听器\n this.removeAllListeners();\n \n this.initialized = false;\n this.logger.debug('QRCodeScanner', '二维码扫描器资源已释放');\n }\n} ","/* eslint-disable */\n/**\n * @file 二维码模块入口\n * @description 提供二维码识别和解析功能的模块入口\n * @module modules/qrcode\n */\n\nimport { BaseModule } from '../../core/base-module';\nimport { QRCodeResult, QRCodeModuleOptions } from './types';\nimport { QRCodeScanner } from './qr-code-scanner';\n\n/**\n * 二维码模块\n * 提供二维码检测和解析功能\n */\nexport class QRCodeModule extends BaseModule {\n /** 模块名称 */\n public readonly name: string = 'qrcode';\n \n /** 模块配置 */\n private options: QRCodeModuleOptions;\n \n /** 二维码扫描器 */\n private scanner: QRCodeScanner;\n \n /** 最后一次扫描结果 */\n private lastScanResult?: QRCodeResult;\n \n /**\n * 构造函数\n * @param options 模块配置选项\n */\n constructor(options: QRCodeModuleOptions = {}) {\n super();\n \n this.options = {\n enabled: true,\n scanner: {\n minConfidence: 0.6,\n tryMultipleScan: true,\n returnImage: false,\n ...options.scanner\n },\n imageProcess: {\n preprocess: true,\n enhanceContrast: true,\n threshold: 128,\n ...options.imageProcess\n },\n ...options\n };\n \n // 创建扫描器\n this.scanner = new QRCodeScanner({\n minConfidence: this.options.scanner?.minConfidence,\n returnImage: this.options.scanner?.returnImage,\n imageProcess: this.options.imageProcess\n });\n }\n \n /**\n * 初始化模块\n */\n public async initialize(): Promise<void> {\n if (this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '初始化二维码模块');\n \n try {\n // 初始化扫描器\n await this.scanner.initialize();\n \n this._isInitialized = true;\n this.emit('initialized');\n this.logger.debug(this.name, '二维码模块初始化完成');\n } catch (error) {\n this.logger.error(this.name, '二维码模块初始化失败', error as Error);\n throw new Error(`二维码模块初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 扫描图像中的二维码\n * @param image 图像源\n * @returns 二维码扫描结果\n */\n public async scan(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<QRCodeResult | undefined> {\n this.ensureInitialized();\n \n try {\n // 扫描二维码\n const scanResult = await this.scanner.scan(image);\n \n if (scanResult) {\n // 保存最后一次扫描结果\n this.lastScanResult = scanResult;\n \n // 触发事件\n this.emit('qrcode:scanned', { result: scanResult });\n }\n \n return scanResult;\n } catch (error) {\n this.logger.error(this.name, '二维码扫描失败', error as Error);\n throw new Error(`二维码扫描失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 获取最后一次扫描结果\n */\n public getLastScanResult(): QRCodeResult | undefined {\n return this.lastScanResult;\n }\n \n /**\n * 解析二维码数据\n * @param data 二维码数据\n * @returns 解析后的数据对象\n */\n public parseQRCodeData(data: string): Record<string, any> | string {\n try {\n // 尝试解析为JSON\n return JSON.parse(data);\n } catch {\n // 不是JSON,尝试解析为URL参数\n if (data.includes('=')) {\n try {\n const params: Record<string, string> = {};\n const urlParams = new URLSearchParams(data.includes('?') ? data.split('?')[1] : data);\n \n urlParams.forEach((value, key) => {\n params[key] = value;\n });\n \n return params;\n } catch {\n // 解析URL参数失败,返回原始字符串\n return data;\n }\n }\n \n // 返回原始字符串\n return data;\n }\n }\n \n /**\n * 释放模块资源\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放二维码模块资源');\n \n try {\n // 释放扫描器资源\n await this.scanner.dispose();\n \n // 调用基类的dispose方法\n await super.dispose();\n } catch (error) {\n this.logger.error(this.name, '二维码模块资源释放失败', error as Error);\n throw new Error(`二维码模块资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// 导出类型\nexport * from './types'; ","/* eslint-disable */\n/**\n * @file 人脸模块入口\n * @description 提供人脸检测、活体检测和人脸比对功能的模块入口\n * @module modules/face\n */\n\nimport { BaseModule } from '../../core/base-module';\nimport { FaceDetectionResult, FaceComparisonResult, FaceModuleOptions } from './types';\n\n/**\n * 人脸模块\n * 提供人脸检测、活体检测和人脸比对功能\n */\nexport class FaceModule extends BaseModule {\n /** 模块名称 */\n public readonly name: string = 'face';\n \n /** 模块配置 */\n private options: FaceModuleOptions;\n \n /** 最后一次检测结果 */\n private lastDetectionResult?: FaceDetectionResult;\n \n /**\n * 构造函数\n * @param options 模块配置选项\n */\n constructor(options: FaceModuleOptions = {}) {\n super();\n \n this.options = {\n enabled: true,\n detector: {\n minConfidence: 0.7,\n detectLandmarks: true,\n detectAttributes: true,\n returnFaceImage: false,\n ...options.detector\n },\n liveness: {\n enabled: false,\n type: 'passive',\n minConfidence: 0.8,\n timeout: 10000,\n ...options.liveness\n },\n comparison: {\n minSimilarity: 0.8,\n ...options.comparison\n },\n ...options\n };\n }\n \n /**\n * 初始化模块\n */\n public async initialize(): Promise<void> {\n if (this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '初始化人脸模块');\n \n try {\n // 在此处初始化人脸检测、活体检测和人脸比对所需的模型\n // 这里只是示例,实际实现需要根据具体的人脸识别库来实现\n \n this._isInitialized = true;\n this.emit('initialized');\n this.logger.debug(this.name, '人脸模块初始化完成');\n } catch (error) {\n this.logger.error(this.name, '人脸模块初始化失败', error as Error);\n throw new Error(`人脸模块初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 检测图像中的人脸\n * @param image 图像源\n * @returns 人脸检测结果\n */\n public async detectFace(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<FaceDetectionResult | undefined> {\n this.ensureInitialized();\n \n try {\n // 在此处实现人脸检测逻辑\n // 这里只是示例,实际实现需要根据具体的人脸识别库来实现\n const faceDetectionResult: FaceDetectionResult = {\n boundingBox: {\n x: 0,\n y: 0,\n width: 100,\n height: 100\n },\n confidence: 0.9\n };\n \n // 保存最后一次检测结果\n this.lastDetectionResult = faceDetectionResult;\n \n // 触发事件\n this.emit('face:detected', { result: faceDetectionResult });\n \n return faceDetectionResult;\n } catch (error) {\n this.logger.error(this.name, '人脸检测失败', error as Error);\n throw new Error(`人脸检测失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 进行活体检测\n * @param image 图像源\n * @returns 活体检测结果\n */\n public async detectLiveness(\n image: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<boolean> {\n this.ensureInitialized();\n \n if (!this.options.liveness?.enabled) {\n throw new Error('活体检测未启用');\n }\n \n try {\n // 在此处实现活体检测逻辑\n // 这里只是示例,实际实现需要根据具体的活体检测算法来实现\n const livenessResult = true;\n \n // 触发事件\n this.emit('face:liveness', { passed: livenessResult });\n \n return livenessResult;\n } catch (error) {\n this.logger.error(this.name, '活体检测失败', error as Error);\n throw new Error(`活体检测失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 比对两个人脸\n * @param face1 第一个人脸图像\n * @param face2 第二个人脸图像\n * @returns 人脸比对结果\n */\n public async compareFaces(\n face1: ImageData | HTMLImageElement | HTMLCanvasElement,\n face2: ImageData | HTMLImageElement | HTMLCanvasElement\n ): Promise<FaceComparisonResult> {\n this.ensureInitialized();\n \n try {\n // 在此处实现人脸比对逻辑\n // 这里只是示例,实际实现需要根据具体的人脸比对算法来实现\n const similarity = 0.85;\n const isMatch = similarity >= (this.options.comparison?.minSimilarity || 0.8);\n \n const comparisonResult: FaceComparisonResult = {\n isMatch,\n similarity,\n confidence: 0.9\n };\n \n // 触发事件\n this.emit('face:compared', { result: comparisonResult });\n \n return comparisonResult;\n } catch (error) {\n this.logger.error(this.name, '人脸比对失败', error as Error);\n throw new Error(`人脸比对失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * 获取最后一次检测结果\n */\n public getLastDetectionResult(): FaceDetectionResult | undefined {\n return this.lastDetectionResult;\n }\n \n /**\n * 释放模块资源\n */\n public async dispose(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n \n this.logger.debug(this.name, '释放人脸模块资源');\n \n try {\n // 在此处释放人脸检测、活体检测和人脸比对所需的模型资源\n // 这里只是示例,实际实现需要根据具体的人脸识别库来实现\n \n // 调用基类的dispose方法\n await super.dispose();\n } catch (error) {\n this.logger.error(this.name, '人脸模块资源释放失败', error as Error);\n throw new Error(`人脸模块资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// 导出类型\nexport * from './types'; ","/**\n * @file 加载状态管理\n * @description 提供模块加载状态跟踪功能\n * @module core/loading-state\n */\n\nimport { EventEmitter } from './event-emitter';\n\n/**\n * 加载状态类型\n */\nexport enum LoadingState {\n /** 空闲 */\n IDLE = 'idle',\n /** 加载中 */\n LOADING = 'loading',\n /** 就绪 */\n READY = 'ready',\n /** 错误 */\n ERROR = 'error',\n /** 已释放 */\n DISPOSED = 'disposed'\n}\n\n/**\n * 加载进度信息\n */\nexport interface LoadingProgress {\n /** 当前状态 */\n state: LoadingState;\n /** 已加载的模型 */\n loadedModels: string[];\n /** 正在加载的模型 */\n loadingModel?: string;\n /** 进度百分比 (0-100) */\n progress: number;\n /** 错误信息 */\n error?: string;\n}\n\n/**\n * 加载状态管理器\n * 用于跟踪和管理模块的加载状态\n */\nexport class LoadingStateManager extends EventEmitter {\n private state: LoadingState = LoadingState.IDLE;\n private loadedModels: Set<string> = new Set();\n private loadingModel?: string;\n private totalModels: number = 0;\n private error?: string;\n\n /**\n * 开始加载\n * @param totalModels 总模型数\n */\n startLoading(totalModels: number): void {\n this.totalModels = totalModels;\n this.state = LoadingState.LOADING;\n this.error = undefined;\n this.emit('stateChange', this.getProgress());\n }\n\n /**\n * 模型开始加载\n * @param modelName 模型名称\n */\n startModelLoading(modelName: string): void {\n this.loadingModel = modelName;\n this.emit('progress', this.getProgress());\n }\n\n /**\n * 模型加载完成\n * @param modelName 模型名称\n */\n completeModelLoading(modelName: string): void {\n this.loadedModels.add(modelName);\n this.loadingModel = undefined;\n this.emit('progress', this.getProgress());\n }\n\n /**\n * 加载完成\n */\n complete(): void {\n this.state = LoadingState.READY;\n this.totalModels = 0;\n this.emit('stateChange', this.getProgress());\n }\n\n /**\n * 加载失败\n * @param error 错误信息\n */\n fail(error: string): void {\n this.state = LoadingState.ERROR;\n this.error = error;\n this.emit('error', { error, progress: this.getProgress() });\n }\n\n /**\n * 释放\n */\n dispose(): void {\n this.state = LoadingState.DISPOSED;\n this.loadedModels.clear();\n this.totalModels = 0;\n this.error = undefined;\n this.emit('stateChange', this.getProgress());\n }\n\n /**\n * 获取当前进度\n */\n getProgress(): LoadingProgress {\n const progress = this.totalModels > 0 \n ? Math.round((this.loadedModels.size / this.totalModels) * 100) \n : 0;\n\n return {\n state: this.state,\n loadedModels: Array.from(this.loadedModels),\n loadingModel: this.loadingModel,\n progress,\n error: this.error\n };\n }\n\n /**\n * 获取当前状态\n */\n getState(): LoadingState {\n return this.state;\n }\n\n /**\n * 是否已就绪\n */\n isReady(): boolean {\n return this.state === LoadingState.READY;\n }\n\n /**\n * 是否有错误\n */\n hasError(): boolean {\n return this.state === LoadingState.ERROR;\n }\n}\n\n/**\n * 创建加载状态管理器\n */\nexport function createLoadingStateManager(): LoadingStateManager {\n return new LoadingStateManager();\n}\n","/**\n * @file 错误处理模块\n * @description 定义ID-Scanner-Lib的错误类层次结构\n * @module core/errors\n */\n\n/**\n * ID-Scanner-Lib 基础错误类\n * 所有库特定错误的基类\n */\nexport class IDScannerError extends Error {\n /** 错误代码 */\n public code: string;\n /** 错误原因 */\n public cause?: Error;\n\n /**\n * 构造函数\n * @param message 错误消息\n * @param options 错误选项\n */\n constructor(message: string, options?: { code?: string; cause?: Error }) {\n super(message);\n \n // 设置错误名称\n this.name = this.constructor.name;\n \n // 设置错误代码\n this.code = options?.code || 'UNKNOWN_ERROR';\n \n // 设置错误原因\n this.cause = options?.cause;\n \n // 捕获堆栈 (Node.js专有,浏览器环境忽略)\n if (typeof (Error as any).captureStackTrace === 'function') {\n (Error as any).captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * 初始化错误\n * 当库初始化失败时抛出\n */\nexport class InitializationError extends IDScannerError {\n constructor(message: string, details?: string) {\n super(`初始化失败: ${message}${details ? ` (${details})` : ''}`, { code: 'INIT_FAILED' });\n this.name = 'InitializationError';\n }\n}\n\n/**\n * 设备错误\n * 当访问硬件设备(如摄像头)失败时抛出\n */\nexport class DeviceError extends IDScannerError {\n constructor(message: string) {\n super(`设备错误: ${message}`, { code: 'DEVICE_ERROR' });\n this.name = 'DeviceError';\n }\n}\n\n/**\n * 摄像头访问错误\n * 当无法访问或启动摄像头时抛出\n */\nexport class CameraAccessError extends IDScannerError {\n constructor(message: string, options?: { code?: string; cause?: Error }) {\n super(`摄像头访问失败: ${message}`, {\n code: options?.code || 'CAMERA_ACCESS_FAILED',\n cause: options?.cause\n });\n this.name = 'CameraAccessError';\n }\n}\n\n/**\n * 人脸检测错误\n * 当人脸检测过程失败时抛出\n */\nexport class FaceDetectionError extends IDScannerError {\n constructor(message: string) {\n super(`人脸检测失败: ${message}`, { code: 'FACE_DETECTION_FAILED' });\n this.name = 'FaceDetectionError';\n }\n}\n\n/**\n * 人脸比对错误\n * 当人脸比对过程失败时抛出\n */\nexport class FaceComparisonError extends IDScannerError {\n constructor(message: string) {\n super(`人脸比对失败: ${message}`, { code: 'FACE_COMPARISON_FAILED' });\n this.name = 'FaceComparisonError';\n }\n}\n\n/**\n * 活体检测错误\n * 当活体检测过程失败时抛出\n */\nexport class LivenessDetectionError extends IDScannerError {\n constructor(message: string) {\n super(`活体检测失败: ${message}`, { code: 'LIVENESS_DETECTION_FAILED' });\n this.name = 'LivenessDetectionError';\n }\n}\n\n/**\n * OCR识别错误\n * 当OCR文字识别失败时抛出\n */\nexport class OCRProcessingError extends IDScannerError {\n constructor(message: string) {\n super(`OCR处理失败: ${message}`, { code: 'OCR_PROCESSING_FAILED' });\n this.name = 'OCRProcessingError';\n }\n}\n\n/**\n * 二维码扫描错误\n * 当二维码扫描失败时抛出\n */\nexport class QRScanError extends IDScannerError {\n constructor(message: string) {\n super(`二维码扫描失败: ${message}`, { code: 'QR_SCAN_FAILED' });\n this.name = 'QRScanError';\n }\n}\n\n/**\n * 身份证检测错误\n * 当身份证检测失败时抛出\n */\nexport class IDCardDetectionError extends IDScannerError {\n constructor(message: string) {\n super(`身份证检测失败: ${message}`, { code: 'ID_CARD_DETECTION_FAILED' });\n this.name = 'IDCardDetectionError';\n }\n}\n\n/**\n * 资源加载错误\n * 当无法加载必要资源(如模型)时抛出\n */\nexport class ResourceLoadError extends IDScannerError {\n constructor(resource: string, reason: string) {\n super(`无法加载资源 ${resource}: ${reason}`, { code: 'RESOURCE_LOAD_FAILED' });\n this.name = 'ResourceLoadError';\n }\n}\n\n/**\n * 参数错误\n * 当提供的参数无效时抛出\n */\nexport class InvalidArgumentError extends IDScannerError {\n constructor(paramName: string, reason: string) {\n super(`无效的参数 ${paramName}: ${reason}`, { code: 'INVALID_ARGUMENT' });\n this.name = 'InvalidArgumentError';\n }\n}\n\n/**\n * 不支持错误\n * 当尝试使用不支持的功能或当前环境无法使用的功能时抛出\n */\nexport class NotSupportedError extends IDScannerError {\n constructor(feature: string) {\n super(`不支持的功能: ${feature}`, { code: 'NOT_SUPPORTED' });\n this.name = 'NotSupportedError';\n }\n} ","/* eslint-disable */\n/**\n * @file 主入口文件\n * @description ID Scanner库的主入口点,提供统一的API和模块导出\n * @module index\n */\n\nimport { ModuleManager } from './core/module-manager';\nimport { IDCardModule } from './modules/id-card';\nimport { QRCodeModule } from './modules/qrcode';\nimport { FaceModule } from './modules/face';\nimport { VERSION, BUILD_DATE } from './version';\nimport { Logger, LogLevel } from './core/logger';\nimport { IDCardModuleOptions } from './modules/id-card/types';\nimport { QRCodeModuleOptions } from './modules/qrcode/types';\nimport { FaceModuleOptions } from './modules/face/types';\n\n/**\n * IDScanner配置选项\n */\nexport interface IDScannerOptions {\n /** 日志级别 */\n logLevel?: LogLevel;\n /** 是否启用身份证识别模块 */\n enableIDCard?: boolean;\n /** 是否启用二维码识别模块 */\n enableQRCode?: boolean;\n /** 是否启用人脸识别模块 */\n enableFace?: boolean;\n /** 身份证模块配置 */\n idCard?: IDCardModuleOptions;\n /** 二维码模块配置 */\n qrCode?: QRCodeModuleOptions;\n /** 人脸识别模块配置 */\n face?: FaceModuleOptions;\n}\n\n/**\n * IDScanner类\n * 提供整合的身份证、二维码和人脸识别功能\n */\nexport class IDScanner {\n /** 版本号 */\n public static readonly VERSION = VERSION;\n /** 构建日期 */\n public static readonly BUILD_DATE = BUILD_DATE;\n \n /** 模块管理器 */\n private moduleManager: ModuleManager;\n /** 是否已经初始化 */\n private initialized = false;\n /** 日志工具 */\n private logger: Logger;\n \n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(options: IDScannerOptions = {}) {\n // 配置日志级别\n this.logger = Logger.getInstance();\n if (options.logLevel !== undefined) {\n this.logger.setLevel(options.logLevel);\n }\n \n this.moduleManager = ModuleManager.getInstance();\n \n // 注册模块\n if (options.enableIDCard !== false) {\n this.moduleManager.register(new IDCardModule(options.idCard));\n }\n \n if (options.enableQRCode !== false) {\n this.moduleManager.register(new QRCodeModule(options.qrCode));\n }\n \n if (options.enableFace !== false) {\n this.moduleManager.register(new FaceModule(options.face));\n }\n }\n\n /**\n * 初始化库\n */\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.logger.info('IDScanner', `初始化 IDScanner v${VERSION}`);\n\n try {\n // 初始化所有模块\n await this.moduleManager.initialize();\n\n this.initialized = true;\n this.logger.info('IDScanner', 'IDScanner初始化完成');\n } catch (error) {\n this.logger.error('IDScanner', 'IDScanner初始化失败', error as Error);\n throw new Error(`IDScanner初始化失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * 获取身份证模块实例\n * @returns 身份证模块\n */\n public getIDCardModule(): IDCardModule | undefined {\n return this.moduleManager.getModule<IDCardModule>('id-card');\n }\n \n /**\n * 获取二维码模块实例\n * @returns 二维码模块\n */\n public getQRCodeModule(): QRCodeModule | undefined {\n return this.moduleManager.getModule<QRCodeModule>('qrcode');\n }\n \n /**\n * 获取人脸识别模块实例\n * @returns 人脸识别模块\n */\n public getFaceModule(): FaceModule | undefined {\n return this.moduleManager.getModule<FaceModule>('face');\n }\n \n /**\n * 释放所有资源\n */\n public async dispose(): Promise<void> {\n if (!this.initialized) {\n return;\n }\n \n this.logger.info('IDScanner', '释放IDScanner资源');\n \n try {\n await this.moduleManager.dispose();\n \n this.initialized = false;\n this.logger.info('IDScanner', 'IDScanner资源已释放');\n } catch (error) {\n this.logger.error('IDScanner', 'IDScanner资源释放失败', error as Error);\n throw new Error(`IDScanner资源释放失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// 导出核心模块\nexport * from './core/loading-state';\nexport * from './core/module-manager';\nexport * from './core/logger';\nexport * from './core/errors';\n\n// 导出功能模块 (明确导出以避免命名冲突)\nexport { IDCardModule } from './modules/id-card';\nexport { QRCodeModule } from './modules/qrcode';\nexport { FaceModule } from './modules/face';\n\n// 导出类型\nexport * from './utils/types';\nexport { IDCardModuleOptions, IDCardInfo, IDCardType, IDCardVerificationResult } from './modules/id-card/types';\nexport { QRCodeModuleOptions, QRCodeResult, BarcodeFormat, DEFAULT_FORMATS } from './modules/qrcode/types';\nexport { FaceModuleOptions, FaceDetectionResult, FaceComparisonResult } from './modules/face/types';\n\n// 默认导出IDScanner类\nexport default IDScanner;\n"],"names":["createCustomWorker","createWorker"],"mappings":"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"}
|