@pisell/materials 6.0.17 → 6.0.19

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 (41) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/index.js +1 -1
  5. package/build/lowcode/meta.js +6 -6
  6. package/build/lowcode/preview.js +7 -7
  7. package/build/lowcode/render/default/view.css +1 -1
  8. package/build/lowcode/render/default/view.js +21 -21
  9. package/build/lowcode/view.css +1 -1
  10. package/build/lowcode/view.js +21 -21
  11. package/es/components/dataSourceComponents/fields/Input/WithMode.d.ts +0 -1
  12. package/es/components/dataSourceComponents/fields/Input/WithMode.js +48 -508
  13. package/es/components/pisellQRScanner/index.d.ts +37 -0
  14. package/es/components/pisellQRScanner/index.js +1153 -0
  15. package/es/components/pisellQRScanner/index.less +71 -0
  16. package/es/index.d.ts +2 -0
  17. package/es/index.js +1 -0
  18. package/es/locales/en-US.d.ts +13 -0
  19. package/es/locales/en-US.js +14 -3
  20. package/es/locales/zh-CN.d.ts +9 -0
  21. package/es/locales/zh-CN.js +11 -1
  22. package/es/locales/zh-TW.d.ts +9 -0
  23. package/es/locales/zh-TW.js +11 -1
  24. package/lib/components/dataSourceComponents/fields/Input/WithMode.d.ts +0 -1
  25. package/lib/components/dataSourceComponents/fields/Input/WithMode.js +44 -323
  26. package/lib/components/pisellQRScanner/index.d.ts +37 -0
  27. package/lib/components/pisellQRScanner/index.js +706 -0
  28. package/lib/components/pisellQRScanner/index.less +71 -0
  29. package/lib/index.d.ts +2 -0
  30. package/lib/index.js +3 -0
  31. package/lib/locales/en-US.d.ts +13 -0
  32. package/lib/locales/en-US.js +19 -1
  33. package/lib/locales/zh-CN.d.ts +9 -0
  34. package/lib/locales/zh-CN.js +11 -1
  35. package/lib/locales/zh-TW.d.ts +9 -0
  36. package/lib/locales/zh-TW.js +11 -1
  37. package/lowcode/pisell-qrscanner/meta.ts +86 -0
  38. package/lowcode/pisell-qrscanner/snippets.ts +25 -0
  39. package/package.json +3 -3
  40. package/es/components/dataSourceComponents/fields/Input/WithMode.less +0 -96
  41. package/lib/components/dataSourceComponents/fields/Input/WithMode.less +0 -96
@@ -0,0 +1,1153 @@
1
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
+ var _excluded = ["visible", "onClose", "onScan", "showUpload", "style", "className"];
3
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
7
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
8
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, catch: function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
9
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
10
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
11
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
12
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
13
+ import React, { useRef, useEffect } from 'react';
14
+ import { message } from 'antd';
15
+ import { BrowserMultiFormatReader, NotFoundException, BarcodeFormat } from '@zxing/library';
16
+ import IconFont from "../iconfont";
17
+ import "./index.less";
18
+ import { createPortal } from 'react-dom';
19
+ import { getText } from "../../locales";
20
+
21
+ // 不使用全局声明,改用本地引入React类型
22
+
23
+ /**
24
+ * 判断是否是二维码
25
+ * @param format 条码格式
26
+ * @returns 是否是二维码
27
+ */
28
+ var isQRCode = function isQRCode(format) {
29
+ return format === BarcodeFormat.QR_CODE;
30
+ };
31
+
32
+ /**
33
+ * 获取条码类型的成功提示文案key
34
+ * @param format 条码格式
35
+ * @returns 对应的文案key
36
+ */
37
+ var getSuccessMessageKey = function getSuccessMessageKey(format) {
38
+ return isQRCode(format) ? 'qrscanner-success-qrcode' : 'qrscanner-success-barcode';
39
+ };
40
+
41
+ /**
42
+ * 二维码扫描组件
43
+ */
44
+ var PisellQRScanner = function PisellQRScanner(_ref) {
45
+ var visible = _ref.visible,
46
+ onClose = _ref.onClose,
47
+ onScan = _ref.onScan,
48
+ _ref$showUpload = _ref.showUpload,
49
+ showUpload = _ref$showUpload === void 0 ? true : _ref$showUpload,
50
+ style = _ref.style,
51
+ className = _ref.className,
52
+ otherProps = _objectWithoutProperties(_ref, _excluded);
53
+ var videoRef = useRef(null);
54
+ var fileInputRef = useRef(null);
55
+ var codeReaderRef = useRef(null);
56
+
57
+ // 处理关闭扫码界面
58
+ var handleScanClose = function handleScanClose() {
59
+ console.log('关闭扫码界面,释放摄像头资源');
60
+ onClose();
61
+
62
+ // 1. 重置并停止解码器
63
+ try {
64
+ if (codeReaderRef.current) {
65
+ console.log('重置codeReader...');
66
+ codeReaderRef.current.reset();
67
+ }
68
+ } catch (err) {
69
+ console.error('重置codeReader出错:', err);
70
+ }
71
+
72
+ // 2. 手动停止视频流轨道
73
+ try {
74
+ if (videoRef.current && videoRef.current.srcObject) {
75
+ console.log('停止视频流...');
76
+ var stream = videoRef.current.srcObject;
77
+ stream.getTracks().forEach(function (track) {
78
+ console.log("\u505C\u6B62".concat(track.kind, "\u8F68\u9053"));
79
+ track.stop();
80
+ });
81
+
82
+ // 清除视频源
83
+ videoRef.current.srcObject = null;
84
+ }
85
+ } catch (err) {
86
+ console.error('停止视频流出错:', err);
87
+ }
88
+ };
89
+
90
+ // 处理上传按钮点击
91
+ var handleUploadClick = function handleUploadClick() {
92
+ var _fileInputRef$current;
93
+ (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 ? void 0 : _fileInputRef$current.click();
94
+ };
95
+
96
+ // 处理文件上传变化
97
+ var handleFileChange = /*#__PURE__*/function () {
98
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(event) {
99
+ var files, file, reader;
100
+ return _regeneratorRuntime().wrap(function _callee18$(_context18) {
101
+ while (1) switch (_context18.prev = _context18.next) {
102
+ case 0:
103
+ files = event.target.files;
104
+ if (!(!files || files.length === 0)) {
105
+ _context18.next = 3;
106
+ break;
107
+ }
108
+ return _context18.abrupt("return");
109
+ case 3:
110
+ _context18.prev = 3;
111
+ file = files[0]; // 检查文件类型
112
+ if (file.type.startsWith('image/')) {
113
+ _context18.next = 8;
114
+ break;
115
+ }
116
+ message.error(getText('qrscanner-error-upload-image'));
117
+ return _context18.abrupt("return");
118
+ case 8:
119
+ // message.loading({ content: getText('qrscanner-loading'), key: 'qrProcessing' });
120
+
121
+ // 直接使用ZXing解码API
122
+ try {
123
+ // 创建文件读取器
124
+ reader = new FileReader(); // 读取完成后的处理
125
+ reader.onload = /*#__PURE__*/function () {
126
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17(e) {
127
+ var img;
128
+ return _regeneratorRuntime().wrap(function _callee17$(_context17) {
129
+ while (1) switch (_context17.prev = _context17.next) {
130
+ case 0:
131
+ if (!(!e.target || !e.target.result)) {
132
+ _context17.next = 3;
133
+ break;
134
+ }
135
+ message.error({
136
+ content: getText('qrscanner-error-load-failed'),
137
+ key: 'qrProcessing'
138
+ });
139
+ return _context17.abrupt("return");
140
+ case 3:
141
+ // 创建图像元素
142
+ img = new Image();
143
+ img.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {
144
+ var canvas, ctx, methods, success, result, i, text, format, isQR;
145
+ return _regeneratorRuntime().wrap(function _callee16$(_context16) {
146
+ while (1) switch (_context16.prev = _context16.next) {
147
+ case 0:
148
+ _context16.prev = 0;
149
+ console.log('图片加载完成,尺寸:', img.width, 'x', img.height);
150
+
151
+ // 创建canvas进行图像处理
152
+ canvas = document.createElement('canvas');
153
+ canvas.width = img.width;
154
+ canvas.height = img.height;
155
+
156
+ // 绘制原始图像
157
+ ctx = canvas.getContext('2d');
158
+ if (ctx) {
159
+ _context16.next = 9;
160
+ break;
161
+ }
162
+ message.error({
163
+ content: '无法创建画布上下文',
164
+ key: 'qrProcessing'
165
+ });
166
+ return _context16.abrupt("return");
167
+ case 9:
168
+ // 绘制到canvas
169
+ ctx.drawImage(img, 0, 0, img.width, img.height);
170
+
171
+ // 尝试不同的图像处理方法
172
+ methods = [
173
+ /*#__PURE__*/
174
+ // 方法1: 原始图像
175
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
176
+ var decoder;
177
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
178
+ while (1) switch (_context.prev = _context.next) {
179
+ case 0:
180
+ console.log('尝试方法1: 原始图像');
181
+ decoder = new BrowserMultiFormatReader(undefined, 2000);
182
+ _context.next = 4;
183
+ return decoder.decodeFromImage(img);
184
+ case 4:
185
+ return _context.abrupt("return", _context.sent);
186
+ case 5:
187
+ case "end":
188
+ return _context.stop();
189
+ }
190
+ }, _callee);
191
+ })),
192
+ /*#__PURE__*/
193
+ // 方法2: 绿色通道增强 (针对微信二维码) - 强级别
194
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
195
+ var greenCanvas, greenCtx, imageData, data, i, red, green, blue, greenImg;
196
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
197
+ while (1) switch (_context3.prev = _context3.next) {
198
+ case 0:
199
+ console.log('尝试方法2: 绿色通道强增强');
200
+ // 创建一个新的canvas
201
+ greenCanvas = document.createElement('canvas');
202
+ greenCanvas.width = img.width;
203
+ greenCanvas.height = img.height;
204
+ greenCtx = greenCanvas.getContext('2d');
205
+ if (greenCtx) {
206
+ _context3.next = 7;
207
+ break;
208
+ }
209
+ throw new Error('无法创建画布上下文');
210
+ case 7:
211
+ // 先绘制原图
212
+ greenCtx.drawImage(img, 0, 0);
213
+
214
+ // 进行绿色通道极致增强
215
+ imageData = greenCtx.getImageData(0, 0, greenCanvas.width, greenCanvas.height);
216
+ data = imageData.data; // 微信二维码专项优化 - 极致绿色增强
217
+ for (i = 0; i < data.length; i += 4) {
218
+ red = data[i];
219
+ green = data[i + 1];
220
+ blue = data[i + 2]; // 绿色主导时,极致增强对比度
221
+ if (green > red * 0.85 || green > blue * 0.85) {
222
+ // 如果绿色值大于阈值,设为黑色(二维码内容)
223
+ if (green > 100) {
224
+ data[i] = 0; // R
225
+ data[i + 1] = 0; // G
226
+ data[i + 2] = 0; // B
227
+ } else {
228
+ // 否则设为白色(二维码背景)
229
+ data[i] = 255; // R
230
+ data[i + 1] = 255; // G
231
+ data[i + 2] = 255; // B
232
+ }
233
+ }
234
+ }
235
+
236
+ // 更新图像数据
237
+ greenCtx.putImageData(imageData, 0, 0);
238
+
239
+ // 创建新图像
240
+ greenImg = new Image();
241
+ return _context3.abrupt("return", new Promise(function (resolve, reject) {
242
+ greenImg.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
243
+ var decoder, _result;
244
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
245
+ while (1) switch (_context2.prev = _context2.next) {
246
+ case 0:
247
+ _context2.prev = 0;
248
+ decoder = new BrowserMultiFormatReader(undefined, 2000);
249
+ _context2.next = 4;
250
+ return decoder.decodeFromImage(greenImg);
251
+ case 4:
252
+ _result = _context2.sent;
253
+ resolve(_result);
254
+ _context2.next = 11;
255
+ break;
256
+ case 8:
257
+ _context2.prev = 8;
258
+ _context2.t0 = _context2["catch"](0);
259
+ reject(_context2.t0);
260
+ case 11:
261
+ case "end":
262
+ return _context2.stop();
263
+ }
264
+ }, _callee2, null, [[0, 8]]);
265
+ }));
266
+ greenImg.onerror = reject;
267
+ greenImg.src = greenCanvas.toDataURL('image/png');
268
+ }));
269
+ case 14:
270
+ case "end":
271
+ return _context3.stop();
272
+ }
273
+ }, _callee3);
274
+ })),
275
+ /*#__PURE__*/
276
+ // 特殊处理:微信绿码专用增强(降低绿色阈值)
277
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
278
+ var wechatCanvas, wechatCtx, imageData, data, i, red, green, blue, brightness, greenRatio, wechatImg;
279
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
280
+ while (1) switch (_context5.prev = _context5.next) {
281
+ case 0:
282
+ console.log('尝试微信绿码专用优化方法');
283
+ wechatCanvas = document.createElement('canvas');
284
+ wechatCanvas.width = img.width;
285
+ wechatCanvas.height = img.height;
286
+ wechatCtx = wechatCanvas.getContext('2d');
287
+ if (wechatCtx) {
288
+ _context5.next = 7;
289
+ break;
290
+ }
291
+ throw new Error('无法创建画布上下文');
292
+ case 7:
293
+ // 先绘制原图
294
+ wechatCtx.drawImage(img, 0, 0);
295
+
296
+ // 针对微信绿码进行特殊处理
297
+ imageData = wechatCtx.getImageData(0, 0, wechatCanvas.width, wechatCanvas.height);
298
+ data = imageData.data; // 更激进的阈值处理,特别是对绿色敏感
299
+ for (i = 0; i < data.length; i += 4) {
300
+ red = data[i];
301
+ green = data[i + 1];
302
+ blue = data[i + 2]; // 检测亮度
303
+ brightness = (red + green + blue) / 3; // 绿色占比
304
+ greenRatio = green / (red + green + blue + 1); // 如果绿色占比较高,转换为黑色
305
+ if (greenRatio > 0.35 && green > 80 && brightness < 200) {
306
+ data[i] = 0; // R
307
+ data[i + 1] = 0; // G
308
+ data[i + 2] = 0; // B
309
+ } else {
310
+ // 其他颜色转为白色
311
+ data[i] = 255; // R
312
+ data[i + 1] = 255; // G
313
+ data[i + 2] = 255; // B
314
+ }
315
+ }
316
+
317
+ // 更新图像数据
318
+ wechatCtx.putImageData(imageData, 0, 0);
319
+
320
+ // 创建新图像
321
+ wechatImg = new Image();
322
+ return _context5.abrupt("return", new Promise(function (resolve, reject) {
323
+ wechatImg.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
324
+ var decoder, _result2;
325
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
326
+ while (1) switch (_context4.prev = _context4.next) {
327
+ case 0:
328
+ _context4.prev = 0;
329
+ decoder = new BrowserMultiFormatReader(undefined, 2500);
330
+ _context4.next = 4;
331
+ return decoder.decodeFromImage(wechatImg);
332
+ case 4:
333
+ _result2 = _context4.sent;
334
+ resolve(_result2);
335
+ _context4.next = 11;
336
+ break;
337
+ case 8:
338
+ _context4.prev = 8;
339
+ _context4.t0 = _context4["catch"](0);
340
+ reject(_context4.t0);
341
+ case 11:
342
+ case "end":
343
+ return _context4.stop();
344
+ }
345
+ }, _callee4, null, [[0, 8]]);
346
+ }));
347
+ wechatImg.onerror = reject;
348
+ wechatImg.src = wechatCanvas.toDataURL('image/png');
349
+ }));
350
+ case 14:
351
+ case "end":
352
+ return _context5.stop();
353
+ }
354
+ }, _callee5);
355
+ })),
356
+ /*#__PURE__*/
357
+ // 方法3: 仅绿色通道
358
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
359
+ var greenOnlyCanvas, greenOnlyCtx, imageData, data, i, greenOnlyImg;
360
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
361
+ while (1) switch (_context7.prev = _context7.next) {
362
+ case 0:
363
+ console.log('尝试方法3: 仅使用绿色通道');
364
+ greenOnlyCanvas = document.createElement('canvas');
365
+ greenOnlyCanvas.width = img.width;
366
+ greenOnlyCanvas.height = img.height;
367
+ greenOnlyCtx = greenOnlyCanvas.getContext('2d');
368
+ if (greenOnlyCtx) {
369
+ _context7.next = 7;
370
+ break;
371
+ }
372
+ throw new Error('无法创建画布上下文');
373
+ case 7:
374
+ // 先绘制原图
375
+ greenOnlyCtx.drawImage(img, 0, 0);
376
+
377
+ // 仅保留绿色通道
378
+ imageData = greenOnlyCtx.getImageData(0, 0, greenOnlyCanvas.width, greenOnlyCanvas.height);
379
+ data = imageData.data;
380
+ for (i = 0; i < data.length; i += 4) {
381
+ // 只保留绿色通道,红蓝设为0
382
+ data[i] = 0; // R
383
+ // G保持不变
384
+ data[i + 2] = 0; // B
385
+ }
386
+
387
+ // 更新图像数据
388
+ greenOnlyCtx.putImageData(imageData, 0, 0);
389
+
390
+ // 创建新图像
391
+ greenOnlyImg = new Image();
392
+ return _context7.abrupt("return", new Promise(function (resolve, reject) {
393
+ greenOnlyImg.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
394
+ var decoder, _result3;
395
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
396
+ while (1) switch (_context6.prev = _context6.next) {
397
+ case 0:
398
+ _context6.prev = 0;
399
+ decoder = new BrowserMultiFormatReader(undefined, 1500);
400
+ _context6.next = 4;
401
+ return decoder.decodeFromImage(greenOnlyImg);
402
+ case 4:
403
+ _result3 = _context6.sent;
404
+ resolve(_result3);
405
+ _context6.next = 11;
406
+ break;
407
+ case 8:
408
+ _context6.prev = 8;
409
+ _context6.t0 = _context6["catch"](0);
410
+ reject(_context6.t0);
411
+ case 11:
412
+ case "end":
413
+ return _context6.stop();
414
+ }
415
+ }, _callee6, null, [[0, 8]]);
416
+ }));
417
+ greenOnlyImg.onerror = reject;
418
+ greenOnlyImg.src = greenOnlyCanvas.toDataURL('image/png');
419
+ }));
420
+ case 14:
421
+ case "end":
422
+ return _context7.stop();
423
+ }
424
+ }, _callee7);
425
+ })),
426
+ /*#__PURE__*/
427
+ // 方法4: 自适应阈值二值化
428
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
429
+ var adaptiveCanvas, adaptiveCtx, imageData, data, sum, count, i, gray, adaptiveThreshold, _i, _gray, val, adaptiveImg;
430
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
431
+ while (1) switch (_context9.prev = _context9.next) {
432
+ case 0:
433
+ console.log('尝试方法4: 自适应阈值二值化');
434
+ adaptiveCanvas = document.createElement('canvas');
435
+ adaptiveCanvas.width = img.width;
436
+ adaptiveCanvas.height = img.height;
437
+ adaptiveCtx = adaptiveCanvas.getContext('2d');
438
+ if (adaptiveCtx) {
439
+ _context9.next = 7;
440
+ break;
441
+ }
442
+ throw new Error('无法创建画布上下文');
443
+ case 7:
444
+ // 先绘制原图
445
+ adaptiveCtx.drawImage(img, 0, 0);
446
+
447
+ // 获取图像数据
448
+ imageData = adaptiveCtx.getImageData(0, 0, adaptiveCanvas.width, adaptiveCanvas.height);
449
+ data = imageData.data; // 计算平均亮度作为阈值
450
+ sum = 0;
451
+ count = 0;
452
+ for (i = 0; i < data.length; i += 4) {
453
+ // 计算灰度值
454
+ gray = 0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2];
455
+ sum += gray;
456
+ count++;
457
+ }
458
+
459
+ // 计算自适应阈值 (平均值的85%)
460
+ adaptiveThreshold = sum / count * 0.85;
461
+ console.log('自适应阈值:', adaptiveThreshold);
462
+
463
+ // 应用自适应阈值
464
+ for (_i = 0; _i < data.length; _i += 4) {
465
+ _gray = 0.299 * data[_i] + 0.587 * data[_i + 1] + 0.114 * data[_i + 2];
466
+ val = _gray < adaptiveThreshold ? 0 : 255;
467
+ data[_i] = val; // R
468
+ data[_i + 1] = val; // G
469
+ data[_i + 2] = val; // B
470
+ }
471
+
472
+ // 更新图像数据
473
+ adaptiveCtx.putImageData(imageData, 0, 0);
474
+
475
+ // 创建新图像
476
+ adaptiveImg = new Image();
477
+ return _context9.abrupt("return", new Promise(function (resolve, reject) {
478
+ adaptiveImg.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
479
+ var decoder, _result4;
480
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
481
+ while (1) switch (_context8.prev = _context8.next) {
482
+ case 0:
483
+ _context8.prev = 0;
484
+ decoder = new BrowserMultiFormatReader(undefined, 1500);
485
+ _context8.next = 4;
486
+ return decoder.decodeFromImage(adaptiveImg);
487
+ case 4:
488
+ _result4 = _context8.sent;
489
+ resolve(_result4);
490
+ _context8.next = 11;
491
+ break;
492
+ case 8:
493
+ _context8.prev = 8;
494
+ _context8.t0 = _context8["catch"](0);
495
+ reject(_context8.t0);
496
+ case 11:
497
+ case "end":
498
+ return _context8.stop();
499
+ }
500
+ }, _callee8, null, [[0, 8]]);
501
+ }));
502
+ adaptiveImg.onerror = reject;
503
+ adaptiveImg.src = adaptiveCanvas.toDataURL('image/png');
504
+ }));
505
+ case 19:
506
+ case "end":
507
+ return _context9.stop();
508
+ }
509
+ }, _callee9);
510
+ })),
511
+ /*#__PURE__*/
512
+ // 方法5: 高斯模糊后锐化
513
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
514
+ var sharpenCanvas, sharpenCtx, imageData, sharpenedData, sharpenImg;
515
+ return _regeneratorRuntime().wrap(function _callee11$(_context11) {
516
+ while (1) switch (_context11.prev = _context11.next) {
517
+ case 0:
518
+ console.log('尝试方法5: 高斯模糊后锐化');
519
+ sharpenCanvas = document.createElement('canvas');
520
+ sharpenCanvas.width = img.width;
521
+ sharpenCanvas.height = img.height;
522
+ sharpenCtx = sharpenCanvas.getContext('2d');
523
+ if (sharpenCtx) {
524
+ _context11.next = 7;
525
+ break;
526
+ }
527
+ throw new Error('无法创建画布上下文');
528
+ case 7:
529
+ // 先绘制原图
530
+ sharpenCtx.drawImage(img, 0, 0);
531
+
532
+ // 设置模糊效果
533
+ sharpenCtx.filter = 'blur(1px)';
534
+ sharpenCtx.drawImage(img, 0, 0);
535
+ sharpenCtx.filter = 'none';
536
+
537
+ // 获取模糊后的图像数据
538
+ imageData = sharpenCtx.getImageData(0, 0, sharpenCanvas.width, sharpenCanvas.height); // 应用锐化
539
+ sharpenedData = applySharpen(imageData, sharpenCanvas.width, sharpenCanvas.height); // 更新图像数据
540
+ sharpenCtx.putImageData(sharpenedData, 0, 0);
541
+
542
+ // 创建新图像
543
+ sharpenImg = new Image();
544
+ return _context11.abrupt("return", new Promise(function (resolve, reject) {
545
+ sharpenImg.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
546
+ var decoder, _result5;
547
+ return _regeneratorRuntime().wrap(function _callee10$(_context10) {
548
+ while (1) switch (_context10.prev = _context10.next) {
549
+ case 0:
550
+ _context10.prev = 0;
551
+ decoder = new BrowserMultiFormatReader(undefined, 1500);
552
+ _context10.next = 4;
553
+ return decoder.decodeFromImage(sharpenImg);
554
+ case 4:
555
+ _result5 = _context10.sent;
556
+ resolve(_result5);
557
+ _context10.next = 11;
558
+ break;
559
+ case 8:
560
+ _context10.prev = 8;
561
+ _context10.t0 = _context10["catch"](0);
562
+ reject(_context10.t0);
563
+ case 11:
564
+ case "end":
565
+ return _context10.stop();
566
+ }
567
+ }, _callee10, null, [[0, 8]]);
568
+ }));
569
+ sharpenImg.onerror = reject;
570
+ sharpenImg.src = sharpenCanvas.toDataURL('image/png');
571
+ }));
572
+ case 16:
573
+ case "end":
574
+ return _context11.stop();
575
+ }
576
+ }, _callee11);
577
+ })),
578
+ /*#__PURE__*/
579
+ // 方法6: 反色处理
580
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13() {
581
+ var invertCanvas, invertCtx, imageData, data, i, invertImg;
582
+ return _regeneratorRuntime().wrap(function _callee13$(_context13) {
583
+ while (1) switch (_context13.prev = _context13.next) {
584
+ case 0:
585
+ console.log('尝试方法6: 反色处理');
586
+ invertCanvas = document.createElement('canvas');
587
+ invertCanvas.width = img.width;
588
+ invertCanvas.height = img.height;
589
+ invertCtx = invertCanvas.getContext('2d');
590
+ if (invertCtx) {
591
+ _context13.next = 7;
592
+ break;
593
+ }
594
+ throw new Error('无法创建画布上下文');
595
+ case 7:
596
+ // 先绘制原图
597
+ invertCtx.drawImage(img, 0, 0);
598
+
599
+ // 反色处理
600
+ imageData = invertCtx.getImageData(0, 0, invertCanvas.width, invertCanvas.height);
601
+ data = imageData.data;
602
+ for (i = 0; i < data.length; i += 4) {
603
+ data[i] = 255 - data[i]; // 反转R
604
+ data[i + 1] = 255 - data[i + 1]; // 反转G
605
+ data[i + 2] = 255 - data[i + 2]; // 反转B
606
+ }
607
+
608
+ // 更新图像数据
609
+ invertCtx.putImageData(imageData, 0, 0);
610
+
611
+ // 创建新图像
612
+ invertImg = new Image();
613
+ return _context13.abrupt("return", new Promise(function (resolve, reject) {
614
+ invertImg.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
615
+ var decoder, _result6;
616
+ return _regeneratorRuntime().wrap(function _callee12$(_context12) {
617
+ while (1) switch (_context12.prev = _context12.next) {
618
+ case 0:
619
+ _context12.prev = 0;
620
+ decoder = new BrowserMultiFormatReader(undefined, 1500);
621
+ _context12.next = 4;
622
+ return decoder.decodeFromImage(invertImg);
623
+ case 4:
624
+ _result6 = _context12.sent;
625
+ resolve(_result6);
626
+ _context12.next = 11;
627
+ break;
628
+ case 8:
629
+ _context12.prev = 8;
630
+ _context12.t0 = _context12["catch"](0);
631
+ reject(_context12.t0);
632
+ case 11:
633
+ case "end":
634
+ return _context12.stop();
635
+ }
636
+ }, _callee12, null, [[0, 8]]);
637
+ }));
638
+ invertImg.onerror = reject;
639
+ invertImg.src = invertCanvas.toDataURL('image/png');
640
+ }));
641
+ case 14:
642
+ case "end":
643
+ return _context13.stop();
644
+ }
645
+ }, _callee13);
646
+ })),
647
+ /*#__PURE__*/
648
+ // 方法7: HSV色彩空间处理微信绿色
649
+ _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15() {
650
+ var hsvCanvas, hsvCtx, imageData, data, i, r, g, b, max, min, diff, h, s, v, isGreen, hsvImg;
651
+ return _regeneratorRuntime().wrap(function _callee15$(_context15) {
652
+ while (1) switch (_context15.prev = _context15.next) {
653
+ case 0:
654
+ console.log('尝试方法7: HSV色彩空间处理');
655
+ hsvCanvas = document.createElement('canvas');
656
+ hsvCanvas.width = img.width;
657
+ hsvCanvas.height = img.height;
658
+ hsvCtx = hsvCanvas.getContext('2d');
659
+ if (hsvCtx) {
660
+ _context15.next = 7;
661
+ break;
662
+ }
663
+ throw new Error('无法创建画布上下文');
664
+ case 7:
665
+ // 先绘制原图
666
+ hsvCtx.drawImage(img, 0, 0);
667
+
668
+ // 获取图像数据
669
+ imageData = hsvCtx.getImageData(0, 0, hsvCanvas.width, hsvCanvas.height);
670
+ data = imageData.data; // RGB转HSV来处理
671
+ for (i = 0; i < data.length; i += 4) {
672
+ r = data[i] / 255;
673
+ g = data[i + 1] / 255;
674
+ b = data[i + 2] / 255;
675
+ max = Math.max(r, g, b);
676
+ min = Math.min(r, g, b);
677
+ diff = max - min; // 计算色相 (Hue)
678
+ h = 0;
679
+ if (max === min) {
680
+ h = 0; // 没有色相
681
+ } else if (max === r) {
682
+ h = (60 * ((g - b) / diff) + 360) % 360;
683
+ } else if (max === g) {
684
+ h = 60 * ((b - r) / diff) + 120;
685
+ } else {
686
+ h = 60 * ((r - g) / diff) + 240;
687
+ }
688
+
689
+ // 计算饱和度 (Saturation)
690
+ s = max === 0 ? 0 : diff / max; // 计算亮度 (Value)
691
+ v = max; // 检测绿色色相 (大约为120度附近)
692
+ isGreen = h >= 90 && h <= 150; // 如果是绿色且饱和度足够高
693
+ if (isGreen && s > 0.2) {
694
+ // 二维码内容设为黑色
695
+ data[i] = 0; // R
696
+ data[i + 1] = 0; // G
697
+ data[i + 2] = 0; // B
698
+ } else {
699
+ // 其他区域设为白色
700
+ data[i] = 255; // R
701
+ data[i + 1] = 255; // G
702
+ data[i + 2] = 255; // B
703
+ }
704
+ }
705
+
706
+ // 更新图像数据
707
+ hsvCtx.putImageData(imageData, 0, 0);
708
+
709
+ // 创建新图像
710
+ hsvImg = new Image();
711
+ return _context15.abrupt("return", new Promise(function (resolve, reject) {
712
+ hsvImg.onload = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14() {
713
+ var decoder, _result7;
714
+ return _regeneratorRuntime().wrap(function _callee14$(_context14) {
715
+ while (1) switch (_context14.prev = _context14.next) {
716
+ case 0:
717
+ _context14.prev = 0;
718
+ decoder = new BrowserMultiFormatReader(undefined, 1500);
719
+ _context14.next = 4;
720
+ return decoder.decodeFromImage(hsvImg);
721
+ case 4:
722
+ _result7 = _context14.sent;
723
+ resolve(_result7);
724
+ _context14.next = 11;
725
+ break;
726
+ case 8:
727
+ _context14.prev = 8;
728
+ _context14.t0 = _context14["catch"](0);
729
+ reject(_context14.t0);
730
+ case 11:
731
+ case "end":
732
+ return _context14.stop();
733
+ }
734
+ }, _callee14, null, [[0, 8]]);
735
+ }));
736
+ hsvImg.onerror = reject;
737
+ hsvImg.src = hsvCanvas.toDataURL('image/png');
738
+ }));
739
+ case 14:
740
+ case "end":
741
+ return _context15.stop();
742
+ }
743
+ }, _callee15);
744
+ }))]; // 依次尝试各种方法
745
+ success = false;
746
+ result = null;
747
+ _context16.prev = 13;
748
+ i = 0;
749
+ case 15:
750
+ if (!(i < methods.length)) {
751
+ _context16.next = 33;
752
+ break;
753
+ }
754
+ _context16.prev = 16;
755
+ console.log("\u5C1D\u8BD5\u65B9\u6CD5".concat(i + 1, "..."));
756
+ _context16.next = 20;
757
+ return methods[i]();
758
+ case 20:
759
+ result = _context16.sent;
760
+ if (!result) {
761
+ _context16.next = 25;
762
+ break;
763
+ }
764
+ success = true;
765
+ console.log("\u65B9\u6CD5".concat(i + 1, "\u6210\u529F!"));
766
+ return _context16.abrupt("break", 33);
767
+ case 25:
768
+ _context16.next = 30;
769
+ break;
770
+ case 27:
771
+ _context16.prev = 27;
772
+ _context16.t0 = _context16["catch"](16);
773
+ console.error("\u65B9\u6CD5".concat(i + 1, "\u5931\u8D25:"), _context16.t0);
774
+ // 继续尝试下一个方法
775
+ case 30:
776
+ i++;
777
+ _context16.next = 15;
778
+ break;
779
+ case 33:
780
+ // 所有方法完成后检查结果
781
+ if (success && result) {
782
+ text = result.getText();
783
+ format = result.getBarcodeFormat();
784
+ isQR = isQRCode(format);
785
+ console.log("\u8BC6\u522B\u6210\u529F - \u7C7B\u578B: ".concat(isQR ? '二维码' : '条形码', ", \u5185\u5BB9:"), text);
786
+
787
+ // 关闭loading
788
+ message.destroy('qrProcessing');
789
+
790
+ // 回调扫描结果
791
+ onScan(text);
792
+
793
+ // 显示成功消息
794
+ // message.success(getText(getSuccessMessageKey(format)) + text);
795
+
796
+ // 关闭扫描界面
797
+ handleScanClose();
798
+ } else {
799
+ // 所有方法都尝试过了,但都失败了
800
+ console.log('识别失败,所有方法都尝试过了');
801
+
802
+ // 关闭loading
803
+ message.destroy('qrProcessing');
804
+
805
+ // 先关闭扫描界面
806
+ handleScanClose();
807
+
808
+ // 然后显示失败消息
809
+ setTimeout(function () {
810
+ message.error({
811
+ content: getText('qrscanner-error-no-code'),
812
+ duration: 3
813
+ });
814
+ }, 100);
815
+ }
816
+ _context16.next = 42;
817
+ break;
818
+ case 36:
819
+ _context16.prev = 36;
820
+ _context16.t1 = _context16["catch"](13);
821
+ console.error('识别过程发生意外错误:', _context16.t1);
822
+
823
+ // 关闭loading
824
+ message.destroy('qrProcessing');
825
+
826
+ // 先关闭扫描界面
827
+ handleScanClose();
828
+
829
+ // 显示错误
830
+ setTimeout(function () {
831
+ message.error({
832
+ content: getText('qrscanner-error-no-code'),
833
+ duration: 3
834
+ });
835
+ }, 100);
836
+ case 42:
837
+ _context16.next = 50;
838
+ break;
839
+ case 44:
840
+ _context16.prev = 44;
841
+ _context16.t2 = _context16["catch"](0);
842
+ console.error('图像处理错误:', _context16.t2);
843
+
844
+ // 关闭loading
845
+ message.destroy('qrProcessing');
846
+
847
+ // 先关闭扫描界面
848
+ handleScanClose();
849
+
850
+ // 显示错误
851
+ setTimeout(function () {
852
+ message.error({
853
+ content: getText('qrscanner-error-process-image'),
854
+ duration: 3
855
+ });
856
+ }, 100);
857
+ case 50:
858
+ case "end":
859
+ return _context16.stop();
860
+ }
861
+ }, _callee16, null, [[0, 44], [13, 36], [16, 27]]);
862
+ }));
863
+ img.onerror = function () {
864
+ // 关闭loading
865
+ message.destroy('qrProcessing');
866
+
867
+ // 先关闭扫描界面
868
+ handleScanClose();
869
+
870
+ // 显示错误
871
+ message.error(getText('qrscanner-error-load-failed'));
872
+ };
873
+
874
+ // 设置图片源
875
+ img.src = e.target.result.toString();
876
+ case 7:
877
+ case "end":
878
+ return _context17.stop();
879
+ }
880
+ }, _callee17);
881
+ }));
882
+ return function (_x2) {
883
+ return _ref3.apply(this, arguments);
884
+ };
885
+ }();
886
+ reader.onerror = function () {
887
+ // 关闭loading
888
+ message.destroy('qrProcessing');
889
+
890
+ // 先关闭扫描界面
891
+ handleScanClose();
892
+
893
+ // 显示错误
894
+ message.error(getText('qrscanner-error-load-failed'));
895
+ };
896
+
897
+ // 以DataURL方式读取文件
898
+ reader.readAsDataURL(file);
899
+ } catch (error) {
900
+ console.error('识别过程错误:', error);
901
+
902
+ // 关闭loading
903
+ message.destroy('qrProcessing');
904
+
905
+ // 先关闭扫描界面
906
+ handleScanClose();
907
+
908
+ // 显示错误
909
+ message.error(getText('qrscanner-error-process-image'));
910
+ }
911
+ _context18.next = 17;
912
+ break;
913
+ case 11:
914
+ _context18.prev = 11;
915
+ _context18.t0 = _context18["catch"](3);
916
+ console.error('处理图片出错', _context18.t0);
917
+
918
+ // 关闭loading
919
+ message.destroy('qrProcessing');
920
+
921
+ // 先关闭扫描界面
922
+ handleScanClose();
923
+
924
+ // 显示错误
925
+ message.error(getText('qrscanner-error-process-image'));
926
+ case 17:
927
+ _context18.prev = 17;
928
+ // 重置文件输入以允许再次选择相同文件
929
+ if (fileInputRef.current) {
930
+ fileInputRef.current.value = '';
931
+ }
932
+ return _context18.finish(17);
933
+ case 20:
934
+ case "end":
935
+ return _context18.stop();
936
+ }
937
+ }, _callee18, null, [[3, 11, 17, 20]]);
938
+ }));
939
+ return function handleFileChange(_x) {
940
+ return _ref2.apply(this, arguments);
941
+ };
942
+ }();
943
+
944
+ // 锐化图像的辅助函数
945
+ var applySharpen = function applySharpen(imageData, width, height) {
946
+ var data = imageData.data;
947
+ var temp = new Uint8ClampedArray(data);
948
+
949
+ // 锐化核
950
+ var kernel = [0, -1, 0, -1, 5, -1, 0, -1, 0];
951
+
952
+ // 应用卷积
953
+ for (var y = 1; y < height - 1; y++) {
954
+ for (var x = 1; x < width - 1; x++) {
955
+ var idx = (y * width + x) * 4;
956
+
957
+ // 对RGB通道应用锐化
958
+ for (var c = 0; c < 3; c++) {
959
+ var val = 0;
960
+ for (var ky = -1; ky <= 1; ky++) {
961
+ for (var kx = -1; kx <= 1; kx++) {
962
+ var kidx = ((y + ky) * width + (x + kx)) * 4 + c;
963
+ val += temp[kidx] * kernel[(ky + 1) * 3 + (kx + 1)];
964
+ }
965
+ }
966
+ data[idx + c] = Math.min(255, Math.max(0, val));
967
+ }
968
+ }
969
+ }
970
+ return imageData;
971
+ };
972
+
973
+ // 初始化摄像头
974
+ useEffect(function () {
975
+ if (visible) {
976
+ var initCamera = /*#__PURE__*/function () {
977
+ var _ref20 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19() {
978
+ return _regeneratorRuntime().wrap(function _callee19$(_context19) {
979
+ while (1) switch (_context19.prev = _context19.next) {
980
+ case 0:
981
+ try {
982
+ // 停止之前的实例
983
+ if (codeReaderRef.current) {
984
+ try {
985
+ codeReaderRef.current.reset();
986
+ } catch (err) {
987
+ console.log('重置之前的实例出错', err);
988
+ }
989
+ }
990
+
991
+ // 创建新实例,使用undefined作为hints参数
992
+ codeReaderRef.current = new BrowserMultiFormatReader(undefined, 300);
993
+ console.log('创建二维码阅读器实例成功');
994
+
995
+ // 从视频设备解码
996
+ codeReaderRef.current.decodeFromVideoDevice(null,
997
+ // 使用默认设备
998
+ videoRef.current, function (result, err) {
999
+ if (result) {
1000
+ var text = result.getText();
1001
+ var format = result.getBarcodeFormat();
1002
+ var isQR = isQRCode(format);
1003
+ console.log("\u626B\u63CF\u6210\u529F - \u7C7B\u578B: ".concat(isQR ? '二维码' : '条形码', ", \u5185\u5BB9:"), text);
1004
+
1005
+ // 通知外部
1006
+ onScan(text);
1007
+
1008
+ // 显示成功消息 - 根据条码类型显示不同提示
1009
+ // message.success(getText(getSuccessMessageKey(format)) + text);
1010
+
1011
+ // 关闭扫描界面
1012
+ handleScanClose();
1013
+ }
1014
+ if (err && !(err instanceof NotFoundException)) {
1015
+ console.error('扫描过程中出错:', err);
1016
+ }
1017
+ });
1018
+ } catch (err) {
1019
+ console.error('摄像头初始化错误', err);
1020
+
1021
+ // 先关闭扫描界面
1022
+ handleScanClose();
1023
+
1024
+ // 延迟显示错误以确保界面已关闭
1025
+ setTimeout(function () {
1026
+ message.error({
1027
+ content: getText('qrscanner-error-camera-init'),
1028
+ duration: 3
1029
+ });
1030
+ }, 100);
1031
+ }
1032
+ case 1:
1033
+ case "end":
1034
+ return _context19.stop();
1035
+ }
1036
+ }, _callee19);
1037
+ }));
1038
+ return function initCamera() {
1039
+ return _ref20.apply(this, arguments);
1040
+ };
1041
+ }();
1042
+ initCamera();
1043
+ }
1044
+ }, [visible]);
1045
+
1046
+ // 组件卸载时清理资源
1047
+ useEffect(function () {
1048
+ return function () {
1049
+ if (codeReaderRef.current) {
1050
+ try {
1051
+ codeReaderRef.current.reset();
1052
+ } catch (err) {
1053
+ console.error('清理资源时出错', err);
1054
+ }
1055
+ }
1056
+ };
1057
+ }, []);
1058
+
1059
+ // 如果不可见,不渲染任何内容
1060
+ if (!visible) return null;
1061
+
1062
+ // 使用createPortal将扫码界面挂载到body上,确保最高层级
1063
+ return /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement("div", {
1064
+ className: "pisell-qr-scanner-fullscreen",
1065
+ style: _objectSpread({
1066
+ zIndex: 99999,
1067
+ position: 'fixed',
1068
+ top: 0,
1069
+ left: 0,
1070
+ right: 0,
1071
+ bottom: 0,
1072
+ width: '100vw',
1073
+ height: '100vh',
1074
+ backgroundColor: '#000',
1075
+ margin: 0,
1076
+ padding: 0,
1077
+ overflow: 'hidden',
1078
+ display: 'flex',
1079
+ justifyContent: 'center',
1080
+ alignItems: 'center',
1081
+ boxSizing: 'border-box'
1082
+ }, style)
1083
+ }, /*#__PURE__*/React.createElement("div", {
1084
+ className: "scan-container",
1085
+ style: {
1086
+ position: 'relative',
1087
+ width: '100%',
1088
+ height: '100%',
1089
+ overflow: 'hidden'
1090
+ }
1091
+ }, /*#__PURE__*/React.createElement("video", {
1092
+ ref: videoRef,
1093
+ className: "scan-video",
1094
+ style: {
1095
+ width: '100%',
1096
+ height: '100%',
1097
+ objectFit: 'cover'
1098
+ },
1099
+ autoPlay: true,
1100
+ playsInline: true,
1101
+ muted: true
1102
+ })), /*#__PURE__*/React.createElement(IconFont, {
1103
+ type: "pisell2-arrow-left",
1104
+ className: "scan-close-left",
1105
+ style: {
1106
+ zIndex: 100000,
1107
+ position: 'fixed',
1108
+ top: '20px',
1109
+ left: '20px',
1110
+ fontSize: '24px',
1111
+ color: '#fff',
1112
+ backgroundColor: 'rgba(255, 255, 255, 0.15)',
1113
+ width: '44px',
1114
+ height: '44px',
1115
+ display: 'flex',
1116
+ alignItems: 'center',
1117
+ justifyContent: 'center',
1118
+ borderRadius: '50%',
1119
+ cursor: 'pointer'
1120
+ },
1121
+ onClick: handleScanClose
1122
+ }), showUpload && /*#__PURE__*/React.createElement(IconFont, {
1123
+ type: "pisell2-image-01",
1124
+ className: "scan-upload",
1125
+ style: {
1126
+ zIndex: 100000,
1127
+ position: 'fixed',
1128
+ right: '30px',
1129
+ bottom: '60px',
1130
+ fontSize: '48px',
1131
+ color: '#fff',
1132
+ backgroundColor: 'rgba(255, 255, 255, 0.15)',
1133
+ width: '88px',
1134
+ height: '88px',
1135
+ display: 'flex',
1136
+ alignItems: 'center',
1137
+ justifyContent: 'center',
1138
+ borderRadius: '50%',
1139
+ cursor: 'pointer'
1140
+ },
1141
+ onClick: handleUploadClick
1142
+ }), /*#__PURE__*/React.createElement("input", {
1143
+ type: "file",
1144
+ ref: fileInputRef,
1145
+ onChange: handleFileChange,
1146
+ accept: "image/*",
1147
+ className: "scan-file-input",
1148
+ style: {
1149
+ display: 'none'
1150
+ }
1151
+ })), document.body);
1152
+ };
1153
+ export default PisellQRScanner;