id-scanner-lib 1.0.0 → 1.1.1

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.
Files changed (57) hide show
  1. package/README.md +96 -0
  2. package/dist/core.d.ts +77 -0
  3. package/dist/id-recognition/data-extractor.d.ts +31 -0
  4. package/dist/id-recognition/id-detector.d.ts +25 -1
  5. package/dist/id-scanner-core.esm.js +10710 -0
  6. package/dist/id-scanner-core.esm.js.map +1 -0
  7. package/dist/id-scanner-core.js +10722 -0
  8. package/dist/id-scanner-core.js.map +1 -0
  9. package/dist/id-scanner-core.min.js +9 -0
  10. package/dist/id-scanner-core.min.js.map +1 -0
  11. package/dist/id-scanner-ocr.esm.js +914 -0
  12. package/dist/id-scanner-ocr.esm.js.map +1 -0
  13. package/dist/id-scanner-ocr.js +923 -0
  14. package/dist/id-scanner-ocr.js.map +1 -0
  15. package/dist/id-scanner-ocr.min.js +9 -0
  16. package/dist/id-scanner-ocr.min.js.map +1 -0
  17. package/dist/id-scanner-qr.esm.js +613 -0
  18. package/dist/id-scanner-qr.esm.js.map +1 -0
  19. package/dist/id-scanner-qr.js +622 -0
  20. package/dist/id-scanner-qr.js.map +1 -0
  21. package/dist/id-scanner-qr.min.js +9 -0
  22. package/dist/id-scanner-qr.min.js.map +1 -0
  23. package/dist/id-scanner.js +1243 -94656
  24. package/dist/id-scanner.js.map +1 -1
  25. package/dist/id-scanner.min.js +7 -7
  26. package/dist/id-scanner.min.js.map +1 -1
  27. package/dist/index-umd.d.ts +96 -0
  28. package/dist/index.d.ts +23 -88
  29. package/dist/ocr-module.d.ts +67 -0
  30. package/dist/qr-module.d.ts +68 -0
  31. package/dist/types/core.d.ts +77 -0
  32. package/dist/types/demo/demo.d.ts +14 -0
  33. package/dist/types/id-recognition/data-extractor.d.ts +105 -0
  34. package/dist/types/id-recognition/id-detector.d.ts +100 -0
  35. package/dist/types/id-recognition/ocr-processor.d.ts +64 -0
  36. package/dist/types/index-umd.d.ts +96 -0
  37. package/dist/types/index.d.ts +78 -0
  38. package/dist/types/ocr-module.d.ts +67 -0
  39. package/dist/types/qr-module.d.ts +68 -0
  40. package/dist/types/scanner/barcode-scanner.d.ts +90 -0
  41. package/dist/types/scanner/qr-scanner.d.ts +80 -0
  42. package/dist/types/utils/camera.d.ts +81 -0
  43. package/dist/types/utils/image-processing.d.ts +75 -0
  44. package/dist/types/utils/types.d.ts +65 -0
  45. package/dist/utils/camera.d.ts +18 -13
  46. package/dist/utils/types.d.ts +6 -6
  47. package/package.json +25 -4
  48. package/src/core.ts +138 -0
  49. package/src/id-recognition/data-extractor.ts +97 -0
  50. package/src/id-recognition/id-detector.ts +20 -2
  51. package/src/id-recognition/ocr-processor.ts +3 -6
  52. package/src/index-umd.ts +240 -0
  53. package/src/index.ts +125 -139
  54. package/src/ocr-module.ts +139 -0
  55. package/src/qr-module.ts +129 -0
  56. package/src/utils/camera.ts +61 -36
  57. package/src/utils/types.ts +23 -6
@@ -0,0 +1,622 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jsqr')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'jsqr'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.IDScannerQR = {}, global.jsQR));
5
+ })(this, (function (exports, jsQR) { 'use strict';
6
+
7
+ /**
8
+ * @file 相机工具类
9
+ * @description 提供访问和控制设备摄像头的功能
10
+ * @module Camera
11
+ */
12
+ /**
13
+ * 相机工具类
14
+ *
15
+ * 提供访问设备摄像头、获取视频流以及捕获图像帧的功能
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // 创建相机实例
20
+ * const camera = new Camera({
21
+ * width: 1280,
22
+ * height: 720,
23
+ * facingMode: 'environment' // 使用后置摄像头
24
+ * });
25
+ *
26
+ * // 初始化相机
27
+ * const videoElement = document.getElementById('video') as HTMLVideoElement;
28
+ * await camera.start(videoElement);
29
+ *
30
+ * // 捕获当前视频帧
31
+ * const imageData = camera.captureFrame();
32
+ *
33
+ * // 使用结束后释放资源
34
+ * camera.stop();
35
+ * ```
36
+ */
37
+ class Camera {
38
+ /**
39
+ * 创建相机实例
40
+ * @param {CameraOptions} [options] - 相机配置选项
41
+ */
42
+ constructor(options = {}) {
43
+ this.options = options;
44
+ this.stream = null;
45
+ this.videoElement = null;
46
+ this.options = {
47
+ width: 640,
48
+ height: 480,
49
+ facingMode: 'environment',
50
+ ...options
51
+ };
52
+ }
53
+ /**
54
+ * 启动摄像头并将视频流绑定到视频元素
55
+ * @param videoElement HTML视频元素
56
+ * @returns Promise<void>
57
+ */
58
+ async start(videoElement) {
59
+ return this.initialize(videoElement);
60
+ }
61
+ /**
62
+ * 停止摄像头并释放资源
63
+ */
64
+ stop() {
65
+ this.release();
66
+ }
67
+ /**
68
+ * 初始化相机,获取视频流并绑定到视频元素
69
+ *
70
+ * @param {HTMLVideoElement} videoElement - 用于显示视频流的视频元素
71
+ * @returns {Promise<void>} 初始化完成的Promise
72
+ * @throws 如果无法访问摄像头,将抛出错误
73
+ */
74
+ async initialize(videoElement) {
75
+ this.videoElement = videoElement;
76
+ try {
77
+ // 构建媒体约束
78
+ const constraints = {
79
+ video: {
80
+ width: { ideal: this.options.width },
81
+ height: { ideal: this.options.height },
82
+ facingMode: this.options.facingMode
83
+ }
84
+ };
85
+ // 获取视频流
86
+ this.stream = await navigator.mediaDevices.getUserMedia(constraints);
87
+ // 绑定到视频元素
88
+ if (this.videoElement) {
89
+ this.videoElement.srcObject = this.stream;
90
+ await new Promise((resolve) => {
91
+ if (this.videoElement) {
92
+ this.videoElement.onloadedmetadata = () => {
93
+ if (this.videoElement) {
94
+ this.videoElement.play().then(() => resolve());
95
+ }
96
+ };
97
+ }
98
+ });
99
+ }
100
+ }
101
+ catch (error) {
102
+ console.error('无法访问摄像头:', error);
103
+ throw new Error('无法访问摄像头。请确保已授予摄像头访问权限,并且摄像头未被其他应用程序占用。');
104
+ }
105
+ }
106
+ /**
107
+ * 捕获当前视频帧
108
+ *
109
+ * @returns {ImageData|null} 视频帧的ImageData对象,如果未初始化则返回null
110
+ */
111
+ captureFrame() {
112
+ if (!this.videoElement) {
113
+ return null;
114
+ }
115
+ // 创建Canvas元素用于捕获视频帧
116
+ const canvas = document.createElement('canvas');
117
+ canvas.width = this.videoElement.videoWidth;
118
+ canvas.height = this.videoElement.videoHeight;
119
+ const context = canvas.getContext('2d');
120
+ if (!context) {
121
+ return null;
122
+ }
123
+ // 将视频内容绘制到Canvas中
124
+ context.drawImage(this.videoElement, 0, 0, canvas.width, canvas.height);
125
+ // 获取ImageData对象
126
+ return context.getImageData(0, 0, canvas.width, canvas.height);
127
+ }
128
+ /**
129
+ * 释放摄像头资源
130
+ */
131
+ release() {
132
+ // 停止视频流的所有轨道
133
+ if (this.stream) {
134
+ this.stream.getTracks().forEach(track => track.stop());
135
+ this.stream = null;
136
+ }
137
+ // 清除视频元素绑定
138
+ if (this.videoElement) {
139
+ this.videoElement.srcObject = null;
140
+ this.videoElement = null;
141
+ }
142
+ }
143
+ }
144
+
145
+ /**
146
+ * @file 二维码扫描模块
147
+ * @description 提供实时二维码扫描和识别功能
148
+ * @module QRScanner
149
+ */
150
+ /**
151
+ * 二维码扫描器类
152
+ *
153
+ * 提供实时扫描和识别摄像头中的二维码的功能
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * // 创建二维码扫描器
158
+ * const qrScanner = new QRScanner({
159
+ * scanInterval: 100, // 每100ms扫描一次
160
+ * onScan: (result) => {
161
+ * console.log('扫描到二维码:', result);
162
+ * },
163
+ * onError: (error) => {
164
+ * console.error('扫描错误:', error);
165
+ * }
166
+ * });
167
+ *
168
+ * // 启动扫描
169
+ * const videoElement = document.getElementById('video') as HTMLVideoElement;
170
+ * await qrScanner.start(videoElement);
171
+ *
172
+ * // 停止扫描
173
+ * qrScanner.stop();
174
+ * ```
175
+ */
176
+ class QRScanner {
177
+ /**
178
+ * 创建二维码扫描器实例
179
+ *
180
+ * @param {QRScannerOptions} [options] - 扫描器配置选项
181
+ */
182
+ constructor(options = {}) {
183
+ this.options = options;
184
+ this.scanning = false;
185
+ this.scanTimer = null;
186
+ this.options = {
187
+ scanInterval: 200,
188
+ ...options
189
+ };
190
+ this.camera = new Camera();
191
+ }
192
+ /**
193
+ * 启动二维码扫描
194
+ *
195
+ * 初始化相机并开始连续扫描视频帧中的二维码
196
+ *
197
+ * @param {HTMLVideoElement} videoElement - 用于显示相机画面的video元素
198
+ * @returns {Promise<void>} 启动完成的Promise
199
+ * @throws 如果无法访问相机,将通过onError回调报告错误
200
+ */
201
+ async start(videoElement) {
202
+ try {
203
+ await this.camera.initialize(videoElement);
204
+ this.scanning = true;
205
+ this.scan();
206
+ }
207
+ catch (error) {
208
+ if (this.options.onError) {
209
+ this.options.onError(error instanceof Error ? error : new Error(String(error)));
210
+ }
211
+ }
212
+ }
213
+ /**
214
+ * 执行一次二维码扫描
215
+ *
216
+ * 内部方法,捕获当前视频帧并尝试识别其中的二维码
217
+ *
218
+ * @private
219
+ */
220
+ scan() {
221
+ if (!this.scanning)
222
+ return;
223
+ const imageData = this.camera.captureFrame();
224
+ if (imageData) {
225
+ const code = jsQR(imageData.data, imageData.width, imageData.height);
226
+ if (code && this.options.onScan) {
227
+ this.options.onScan(code.data);
228
+ }
229
+ }
230
+ this.scanTimer = window.setTimeout(() => this.scan(), this.options.scanInterval);
231
+ }
232
+ /**
233
+ * 停止二维码扫描
234
+ *
235
+ * 停止扫描循环并释放相机资源
236
+ */
237
+ stop() {
238
+ this.scanning = false;
239
+ if (this.scanTimer) {
240
+ clearTimeout(this.scanTimer);
241
+ this.scanTimer = null;
242
+ }
243
+ this.camera.release();
244
+ }
245
+ }
246
+
247
+ /**
248
+ * @file 图像处理工具类
249
+ * @description 提供图像处理相关的辅助功能
250
+ * @module ImageProcessor
251
+ */
252
+ /**
253
+ * 图像处理工具类
254
+ *
255
+ * 提供常用的图像处理功能,如亮度和对比度调整、灰度转换、图像大小调整等。
256
+ * 这些功能可用于增强图像质量,提高OCR和扫描的识别率。
257
+ *
258
+ * @example
259
+ * ```typescript
260
+ * // 使用图像处理功能增强图像
261
+ * const enhancedImage = ImageProcessor.adjustBrightnessContrast(
262
+ * originalImageData,
263
+ * 15, // 增加亮度
264
+ * 25 // 增加对比度
265
+ * );
266
+ *
267
+ * // 转换为灰度图像
268
+ * const grayImage = ImageProcessor.toGrayscale(originalImageData);
269
+ * ```
270
+ */
271
+ class ImageProcessor {
272
+ /**
273
+ * 将ImageData转换为Canvas元素
274
+ *
275
+ * @param {ImageData} imageData - 要转换的图像数据
276
+ * @returns {HTMLCanvasElement} 包含图像的Canvas元素
277
+ */
278
+ static imageDataToCanvas(imageData) {
279
+ const canvas = document.createElement('canvas');
280
+ canvas.width = imageData.width;
281
+ canvas.height = imageData.height;
282
+ const ctx = canvas.getContext('2d');
283
+ if (ctx) {
284
+ ctx.putImageData(imageData, 0, 0);
285
+ }
286
+ return canvas;
287
+ }
288
+ /**
289
+ * 将Canvas转换为ImageData
290
+ *
291
+ * @param {HTMLCanvasElement} canvas - 要转换的Canvas元素
292
+ * @returns {ImageData|null} Canvas的图像数据,如果获取失败则返回null
293
+ */
294
+ static canvasToImageData(canvas) {
295
+ const ctx = canvas.getContext('2d');
296
+ return ctx ? ctx.getImageData(0, 0, canvas.width, canvas.height) : null;
297
+ }
298
+ /**
299
+ * 调整图像亮度和对比度
300
+ *
301
+ * @param {ImageData} imageData - 要处理的图像数据
302
+ * @param {number} [brightness=0] - 亮度调整值,正值增加亮度,负值降低亮度,范围建议为-100到100
303
+ * @param {number} [contrast=0] - 对比度调整值,正值增加对比度,负值降低对比度,范围建议为-100到100
304
+ * @returns {ImageData} 处理后的图像数据
305
+ */
306
+ static adjustBrightnessContrast(imageData, brightness = 0, contrast = 0) {
307
+ const canvas = this.imageDataToCanvas(imageData);
308
+ const ctx = canvas.getContext('2d');
309
+ if (ctx) {
310
+ const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
311
+ const data = imgData.data;
312
+ // 调整对比度算法
313
+ const factor = (259 * (contrast + 255)) / (255 * (259 - contrast));
314
+ for (let i = 0; i < data.length; i += 4) {
315
+ // 红色
316
+ data[i] = this.truncate(factor * (data[i] - 128) + 128 + brightness);
317
+ // 绿色
318
+ data[i + 1] = this.truncate(factor * (data[i + 1] - 128) + 128 + brightness);
319
+ // 蓝色
320
+ data[i + 2] = this.truncate(factor * (data[i + 2] - 128) + 128 + brightness);
321
+ // Alpha不变
322
+ }
323
+ ctx.putImageData(imgData, 0, 0);
324
+ return imgData;
325
+ }
326
+ return imageData;
327
+ }
328
+ /**
329
+ * 确保值在0-255范围内
330
+ *
331
+ * @private
332
+ * @param {number} value - 要截断的值
333
+ * @returns {number} 截断后的值,范围为0-255
334
+ */
335
+ static truncate(value) {
336
+ return Math.min(255, Math.max(0, value));
337
+ }
338
+ /**
339
+ * 将彩色图像转换为灰度图像
340
+ *
341
+ * 灰度转换可以简化图像,提高OCR和条形码识别的准确率
342
+ *
343
+ * @param {ImageData} imageData - 要转换的彩色图像
344
+ * @returns {ImageData} 转换后的灰度图像
345
+ */
346
+ static toGrayscale(imageData) {
347
+ const canvas = this.imageDataToCanvas(imageData);
348
+ const ctx = canvas.getContext('2d');
349
+ if (ctx) {
350
+ const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
351
+ const data = imgData.data;
352
+ for (let i = 0; i < data.length; i += 4) {
353
+ const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
354
+ data[i] = avg; // 红色
355
+ data[i + 1] = avg; // 绿色
356
+ data[i + 2] = avg; // 蓝色
357
+ // Alpha不变
358
+ }
359
+ ctx.putImageData(imgData, 0, 0);
360
+ return imgData;
361
+ }
362
+ return imageData;
363
+ }
364
+ /**
365
+ * 调整图像大小
366
+ *
367
+ * @param {ImageData} imageData - 原图像数据
368
+ * @param {number} newWidth - 新宽度
369
+ * @param {number} newHeight - 新高度
370
+ * @returns {ImageData} 调整大小后的图像数据
371
+ */
372
+ static resize(imageData, newWidth, newHeight) {
373
+ const canvas = document.createElement('canvas');
374
+ canvas.width = newWidth;
375
+ canvas.height = newHeight;
376
+ const ctx = canvas.getContext('2d');
377
+ if (ctx) {
378
+ const tempCanvas = this.imageDataToCanvas(imageData);
379
+ ctx.drawImage(tempCanvas, 0, 0, imageData.width, imageData.height, 0, 0, newWidth, newHeight);
380
+ return ctx.getImageData(0, 0, newWidth, newHeight);
381
+ }
382
+ return imageData;
383
+ }
384
+ }
385
+
386
+ /**
387
+ * @file 条形码扫描模块
388
+ * @description 提供实时条形码扫描和识别功能
389
+ * @module BarcodeScanner
390
+ */
391
+ /**
392
+ * 条形码扫描器类
393
+ *
394
+ * 提供实时扫描和识别摄像头中的条形码的功能
395
+ * 注意:当前实现是简化版,实际项目中建议集成专门的条形码识别库如ZXing或Quagga.js
396
+ *
397
+ * @example
398
+ * ```typescript
399
+ * // 创建条形码扫描器
400
+ * const barcodeScanner = new BarcodeScanner({
401
+ * scanInterval: 100, // 每100ms扫描一次
402
+ * onScan: (result) => {
403
+ * console.log('扫描到条形码:', result);
404
+ * },
405
+ * onError: (error) => {
406
+ * console.error('扫描错误:', error);
407
+ * }
408
+ * });
409
+ *
410
+ * // 启动扫描
411
+ * const videoElement = document.getElementById('video') as HTMLVideoElement;
412
+ * await barcodeScanner.start(videoElement);
413
+ *
414
+ * // 停止扫描
415
+ * barcodeScanner.stop();
416
+ * ```
417
+ */
418
+ class BarcodeScanner {
419
+ /**
420
+ * 创建条形码扫描器实例
421
+ *
422
+ * @param {BarcodeScannerOptions} [options] - 扫描器配置选项
423
+ */
424
+ constructor(options = {}) {
425
+ this.options = options;
426
+ this.scanning = false;
427
+ this.scanTimer = null;
428
+ this.options = {
429
+ scanInterval: 200,
430
+ ...options
431
+ };
432
+ this.camera = new Camera();
433
+ }
434
+ /**
435
+ * 启动条形码扫描
436
+ *
437
+ * 初始化相机并开始连续扫描视频帧中的条形码
438
+ *
439
+ * @param {HTMLVideoElement} videoElement - 用于显示相机画面的video元素
440
+ * @returns {Promise<void>} 启动完成的Promise
441
+ * @throws 如果无法访问相机,将通过onError回调报告错误
442
+ */
443
+ async start(videoElement) {
444
+ try {
445
+ await this.camera.initialize(videoElement);
446
+ this.scanning = true;
447
+ this.scan();
448
+ }
449
+ catch (error) {
450
+ if (this.options.onError) {
451
+ this.options.onError(error instanceof Error ? error : new Error(String(error)));
452
+ }
453
+ }
454
+ }
455
+ /**
456
+ * 执行一次条形码扫描
457
+ *
458
+ * 内部方法,捕获当前视频帧并尝试识别其中的条形码
459
+ *
460
+ * @private
461
+ */
462
+ scan() {
463
+ if (!this.scanning)
464
+ return;
465
+ const imageData = this.camera.captureFrame();
466
+ if (imageData) {
467
+ try {
468
+ // 图像预处理,提高识别率
469
+ const enhancedImage = ImageProcessor.adjustBrightnessContrast(ImageProcessor.toGrayscale(imageData), 10, // 亮度
470
+ 20 // 对比度
471
+ );
472
+ // 这里实际项目中可以集成第三方条形码扫描库
473
+ // 如 ZXing 或 QuaggaJS
474
+ // 简化实现,这里仅为示例
475
+ this.detectBarcode(enhancedImage);
476
+ }
477
+ catch (error) {
478
+ console.error('条形码扫描错误:', error);
479
+ }
480
+ }
481
+ this.scanTimer = window.setTimeout(() => this.scan(), this.options.scanInterval);
482
+ }
483
+ /**
484
+ * 条形码检测方法
485
+ *
486
+ * 注意:这是一个简化实现,实际需要集成专门的条形码识别库
487
+ *
488
+ * @private
489
+ * @param {ImageData} imageData - 要检测条形码的图像数据
490
+ */
491
+ detectBarcode(imageData) {
492
+ // 这里应集成条形码识别库
493
+ // 如 ZXing 或 QuaggaJS
494
+ // 简化示例,实际项目中请替换为真实实现
495
+ console.log('正在扫描条形码...');
496
+ // 模拟找到条形码
497
+ if (Math.random() > 0.95) {
498
+ const mockResult = '6901234567890'; // 模拟条形码结果
499
+ if (this.options.onScan) {
500
+ this.options.onScan(mockResult);
501
+ }
502
+ }
503
+ }
504
+ /**
505
+ * 停止条形码扫描
506
+ *
507
+ * 停止扫描循环并释放相机资源
508
+ */
509
+ stop() {
510
+ this.scanning = false;
511
+ if (this.scanTimer) {
512
+ clearTimeout(this.scanTimer);
513
+ this.scanTimer = null;
514
+ }
515
+ this.camera.release();
516
+ }
517
+ }
518
+
519
+ /**
520
+ * @file 二维码和条形码扫描模块
521
+ * @description 包含二维码和条形码扫描功能
522
+ * @module IDScannerQR
523
+ * @version 1.0.0
524
+ * @license MIT
525
+ */
526
+ /**
527
+ * 扫描模块类
528
+ *
529
+ * 提供独立的二维码和条形码扫描功能
530
+ */
531
+ class ScannerModule {
532
+ /**
533
+ * 构造函数
534
+ * @param options 配置选项
535
+ */
536
+ constructor(options = {}) {
537
+ this.options = options;
538
+ this.scanMode = null;
539
+ this.videoElement = null;
540
+ this.camera = new Camera(options.cameraOptions);
541
+ this.qrScanner = new QRScanner({
542
+ ...options.qrScannerOptions,
543
+ onScan: this.handleQRScan.bind(this)
544
+ });
545
+ this.barcodeScanner = new BarcodeScanner({
546
+ ...options.barcodeScannerOptions,
547
+ onScan: this.handleBarcodeScan.bind(this)
548
+ });
549
+ }
550
+ /**
551
+ * 启动二维码扫描
552
+ * @param videoElement HTML视频元素
553
+ */
554
+ async startQRScanner(videoElement) {
555
+ this.stop(); // 确保先停止可能正在运行的扫描
556
+ this.videoElement = videoElement;
557
+ this.scanMode = 'qr';
558
+ await this.camera.start(videoElement);
559
+ this.qrScanner.start(videoElement);
560
+ }
561
+ /**
562
+ * 启动条形码扫描
563
+ * @param videoElement HTML视频元素
564
+ */
565
+ async startBarcodeScanner(videoElement) {
566
+ this.stop(); // 确保先停止可能正在运行的扫描
567
+ this.videoElement = videoElement;
568
+ this.scanMode = 'barcode';
569
+ await this.camera.start(videoElement);
570
+ this.barcodeScanner.start(videoElement);
571
+ }
572
+ /**
573
+ * 停止扫描
574
+ */
575
+ stop() {
576
+ if (this.scanMode === 'qr') {
577
+ this.qrScanner.stop();
578
+ }
579
+ else if (this.scanMode === 'barcode') {
580
+ this.barcodeScanner.stop();
581
+ }
582
+ if (this.videoElement) {
583
+ this.camera.stop();
584
+ }
585
+ this.scanMode = null;
586
+ }
587
+ /**
588
+ * 处理二维码扫描结果
589
+ */
590
+ handleQRScan(result) {
591
+ if (this.options.onQRCodeScanned) {
592
+ this.options.onQRCodeScanned(result);
593
+ }
594
+ }
595
+ /**
596
+ * 处理条形码扫描结果
597
+ */
598
+ handleBarcodeScan(result) {
599
+ if (this.options.onBarcodeScanned) {
600
+ this.options.onBarcodeScanned(result);
601
+ }
602
+ }
603
+ /**
604
+ * 处理错误
605
+ */
606
+ handleError(error) {
607
+ if (this.options.onError) {
608
+ this.options.onError(error);
609
+ }
610
+ else {
611
+ console.error('ScannerModule error:', error);
612
+ }
613
+ }
614
+ }
615
+
616
+ exports.BarcodeScanner = BarcodeScanner;
617
+ exports.Camera = Camera;
618
+ exports.QRScanner = QRScanner;
619
+ exports.ScannerModule = ScannerModule;
620
+
621
+ }));
622
+ //# sourceMappingURL=id-scanner-qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-scanner-qr.js","sources":["../src/utils/camera.ts","../src/scanner/qr-scanner.ts","../src/utils/image-processing.ts","../src/scanner/barcode-scanner.ts","../src/qr-module.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jsqr")):"function"==typeof define&&define.amd?define(["exports","jsqr"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).IDScannerQR={},t.jsQR)}(this,(function(t,e){"use strict";class n{constructor(t={}){this.options=t,this.stream=null,this.videoElement=null,this.options={width:640,height:480,facingMode:"environment",...t}}async start(t){return this.initialize(t)}stop(){this.release()}async initialize(t){this.videoElement=t;try{const t={video:{width:{ideal:this.options.width},height:{ideal:this.options.height},facingMode:this.options.facingMode}};this.stream=await navigator.mediaDevices.getUserMedia(t),this.videoElement&&(this.videoElement.srcObject=this.stream,await new Promise((t=>{this.videoElement&&(this.videoElement.onloadedmetadata=()=>{this.videoElement&&this.videoElement.play().then((()=>t()))})})))}catch(t){throw console.error("无法访问摄像头:",t),new Error("无法访问摄像头。请确保已授予摄像头访问权限,并且摄像头未被其他应用程序占用。")}}captureFrame(){if(!this.videoElement)return null;const t=document.createElement("canvas");t.width=this.videoElement.videoWidth,t.height=this.videoElement.videoHeight;const e=t.getContext("2d");return e?(e.drawImage(this.videoElement,0,0,t.width,t.height),e.getImageData(0,0,t.width,t.height)):null}release(){this.stream&&(this.stream.getTracks().forEach((t=>t.stop())),this.stream=null),this.videoElement&&(this.videoElement.srcObject=null,this.videoElement=null)}}class s{constructor(t={}){this.options=t,this.scanning=!1,this.scanTimer=null,this.options={scanInterval:200,...t},this.camera=new n}async start(t){try{await this.camera.initialize(t),this.scanning=!0,this.scan()}catch(t){this.options.onError&&this.options.onError(t instanceof Error?t:new Error(String(t)))}}scan(){if(!this.scanning)return;const t=this.camera.captureFrame();if(t){const n=e(t.data,t.width,t.height);n&&this.options.onScan&&this.options.onScan(n.data)}this.scanTimer=window.setTimeout((()=>this.scan()),this.options.scanInterval)}stop(){this.scanning=!1,this.scanTimer&&(clearTimeout(this.scanTimer),this.scanTimer=null),this.camera.release()}}class i{static imageDataToCanvas(t){const e=document.createElement("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");return n&&n.putImageData(t,0,0),e}static canvasToImageData(t){const e=t.getContext("2d");return e?e.getImageData(0,0,t.width,t.height):null}static adjustBrightnessContrast(t,e=0,n=0){const s=this.imageDataToCanvas(t),i=s.getContext("2d");if(i){const t=i.getImageData(0,0,s.width,s.height),a=t.data,o=259*(n+255)/(255*(259-n));for(let t=0;t<a.length;t+=4)a[t]=this.truncate(o*(a[t]-128)+128+e),a[t+1]=this.truncate(o*(a[t+1]-128)+128+e),a[t+2]=this.truncate(o*(a[t+2]-128)+128+e);return i.putImageData(t,0,0),t}return t}static truncate(t){return Math.min(255,Math.max(0,t))}static toGrayscale(t){const e=this.imageDataToCanvas(t),n=e.getContext("2d");if(n){const t=n.getImageData(0,0,e.width,e.height),s=t.data;for(let t=0;t<s.length;t+=4){const e=(s[t]+s[t+1]+s[t+2])/3;s[t]=e,s[t+1]=e,s[t+2]=e}return n.putImageData(t,0,0),t}return t}static resize(t,e,n){const s=document.createElement("canvas");s.width=e,s.height=n;const i=s.getContext("2d");if(i){const s=this.imageDataToCanvas(t);return i.drawImage(s,0,0,t.width,t.height,0,0,e,n),i.getImageData(0,0,e,n)}return t}}class a{constructor(t={}){this.options=t,this.scanning=!1,this.scanTimer=null,this.options={scanInterval:200,...t},this.camera=new n}async start(t){try{await this.camera.initialize(t),this.scanning=!0,this.scan()}catch(t){this.options.onError&&this.options.onError(t instanceof Error?t:new Error(String(t)))}}scan(){if(!this.scanning)return;const t=this.camera.captureFrame();if(t)try{const e=i.adjustBrightnessContrast(i.toGrayscale(t),10,20);this.detectBarcode(e)}catch(t){console.error("条形码扫描错误:",t)}this.scanTimer=window.setTimeout((()=>this.scan()),this.options.scanInterval)}detectBarcode(t){if(console.log("正在扫描条形码..."),Math.random()>.95){const t="6901234567890";this.options.onScan&&this.options.onScan(t)}}stop(){this.scanning=!1,this.scanTimer&&(clearTimeout(this.scanTimer),this.scanTimer=null),this.camera.release()}}
2
+ /**
3
+ * @file 二维码和条形码扫描模块
4
+ * @description 包含二维码和条形码扫描功能
5
+ * @module IDScannerQR
6
+ * @version 1.0.0
7
+ * @license MIT
8
+ */t.BarcodeScanner=a,t.Camera=n,t.QRScanner=s,t.ScannerModule=class{constructor(t={}){this.options=t,this.scanMode=null,this.videoElement=null,this.camera=new n(t.cameraOptions),this.qrScanner=new s({...t.qrScannerOptions,onScan:this.handleQRScan.bind(this)}),this.barcodeScanner=new a({...t.barcodeScannerOptions,onScan:this.handleBarcodeScan.bind(this)})}async startQRScanner(t){this.stop(),this.videoElement=t,this.scanMode="qr",await this.camera.start(t),this.qrScanner.start(t)}async startBarcodeScanner(t){this.stop(),this.videoElement=t,this.scanMode="barcode",await this.camera.start(t),this.barcodeScanner.start(t)}stop(){"qr"===this.scanMode?this.qrScanner.stop():"barcode"===this.scanMode&&this.barcodeScanner.stop(),this.videoElement&&this.camera.stop(),this.scanMode=null}handleQRScan(t){this.options.onQRCodeScanned&&this.options.onQRCodeScanned(t)}handleBarcodeScan(t){this.options.onBarcodeScanned&&this.options.onBarcodeScanned(t)}handleError(t){this.options.onError?this.options.onError(t):console.error("ScannerModule error:",t)}}}));
9
+ //# sourceMappingURL=id-scanner-qr.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-scanner-qr.min.js","sources":["../src/utils/camera.ts","../src/scanner/qr-scanner.ts","../src/utils/image-processing.ts","../src/scanner/barcode-scanner.ts","../src/qr-module.ts"],"sourcesContent":[null,null,null,null,null],"names":["Camera","constructor","options","this","stream","videoElement","width","height","facingMode","start","initialize","stop","release","constraints","video","ideal","navigator","mediaDevices","getUserMedia","srcObject","Promise","resolve","onloadedmetadata","play","then","error","console","Error","captureFrame","canvas","document","createElement","videoWidth","videoHeight","context","getContext","drawImage","getImageData","getTracks","forEach","track","QRScanner","scanning","scanTimer","scanInterval","camera","scan","onError","String","imageData","code","jsQR","data","onScan","window","setTimeout","clearTimeout","ImageProcessor","imageDataToCanvas","ctx","putImageData","canvasToImageData","adjustBrightnessContrast","brightness","contrast","imgData","factor","i","length","truncate","value","Math","min","max","toGrayscale","avg","resize","newWidth","newHeight","tempCanvas","BarcodeScanner","enhancedImage","detectBarcode","log","random","mockResult","scanMode","cameraOptions","qrScanner","qrScannerOptions","handleQRScan","bind","barcodeScanner","barcodeScannerOptions","handleBarcodeScan","startQRScanner","startBarcodeScanner","result","onQRCodeScanned","onBarcodeScanned","handleError"],"mappings":"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"}