From 487376b559344f3bb26e17127637833581962abd Mon Sep 17 00:00:00 2001 From: Justin Date: Thu, 26 Dec 2024 14:38:43 +0800 Subject: [PATCH 1/3] update hello-world README --- hello-world/angular/README.md | 29 ++++++------- hello-world/blazor/README.md | 70 +++++++++++++++---------------- hello-world/electron/README.md | 31 ++++++-------- hello-world/next/README.md | 40 ++++++++++-------- hello-world/nuxt/README.md | 62 ++++++++++++++++++++------- hello-world/react-hooks/README.md | 47 ++++++++++++--------- hello-world/react/README.md | 29 ++++++++----- hello-world/svelte/README.md | 35 +++++++++------- hello-world/vue/README.md | 37 ++++++++-------- 9 files changed, 219 insertions(+), 161 deletions(-) diff --git a/hello-world/angular/README.md b/hello-world/angular/README.md index fe6c10a1..964bc540 100644 --- a/hello-world/angular/README.md +++ b/hello-world/angular/README.md @@ -118,7 +118,7 @@ ng generate component video-capture >
Results: -
+
{{resultText}}
``` * In `video-capture.component.ts`, add code for initializing and destroying some instances. For our stylesheet (CSS) specification, please refer to our [source code](#Official-Sample). @@ -141,7 +141,7 @@ const componentDestroyedErrorMsg = 'VideoCapture Component Destroyed'; }) export class VideoCaptureComponent { @ViewChild('cameraViewContainer') cameraViewContainer?: ElementRef; - @ViewChild('results') resultsContainer?: ElementRef; + resultText = ""; resolveInit?: () => void; pInit: Promise = new Promise((r) => { @@ -179,10 +179,10 @@ export class VideoCaptureComponent { onDecodedBarcodesReceived: (result) => { if (!result.barcodeResultItems.length) return; - this.resultsContainer!.nativeElement.textContent = ''; + this.resultText = ''; console.log(result); for (let item of result.barcodeResultItems) { - this.resultsContainer!.nativeElement.textContent += `${item.formatString}: ${item.text}\n\n`; + this.resultText += `${item.formatString}: ${item.text}\n\n`; } }, }); @@ -200,6 +200,7 @@ export class VideoCaptureComponent { // Open camera and start scanning single barcode. await this.cameraEnhancer.open(); + cameraView.setScanLaserVisible(true); if (this.isDestroyed) { throw Error(componentDestroyedErrorMsg); } @@ -235,7 +236,7 @@ export class VideoCaptureComponent { ``` > Note: > -> If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customize-the-ui) +> If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customizing-the-ui) ### Generate and edit the `image-capture` component @@ -259,7 +260,7 @@ ng generate component image-capture accept=".jpg,.jpeg,.icon,.gif,.svg,.webp,.png,.bmp" /> -
+
{{resultText}}
``` @@ -280,7 +281,7 @@ import { CaptureVisionRouter } from 'dynamsoft-capture-vision-router'; standalone: true, }) export class ImageCaptureComponent { - @ViewChild('results') resultsContainer?: ElementRef; + resultText = ""; pCvRouter?: Promise; isDestroyed = false; @@ -288,7 +289,7 @@ export class ImageCaptureComponent { captureImage = async (e: Event) => { let files = [...((e.target! as HTMLInputElement).files as any as File[])]; (e.target! as HTMLInputElement).value = ''; // reset input - this.resultsContainer!.nativeElement.innerText = ''; + this.resultText = ''; try { // ensure cvRouter is created only once const cvRouter = await (this.pCvRouter = @@ -296,25 +297,25 @@ export class ImageCaptureComponent { if (this.isDestroyed) return; for (let file of files) { - // Decode selected image with 'ReadBarcodes_SpeedFirst' template. - const result = await cvRouter.capture(file, 'ReadBarcodes_SpeedFirst'); + // Decode selected image with 'ReadBarcodes_ReadRateFirst' template. + const result = await cvRouter.capture(file, 'ReadBarcodes_ReadRateFirst'); + console.log(result); if (this.isDestroyed) return; // Print file name if there's multiple files if (files.length > 1) { - this.resultsContainer!.nativeElement.innerText += `\n${file.name}:\n`; + this.resultText += `\n${file.name}:\n`; } for (let _item of result.items) { if (_item.type !== EnumCapturedResultItemType.CRIT_BARCODE) { continue; // check if captured result item is a barcode } let item = _item as BarcodeResultItem; - this.resultsContainer!.nativeElement.innerText += item.text + '\n'; // output the decoded barcode text - console.log(item.text); + this.resultText += item.text + '\n'; // output the decoded barcode text } // If no items are found, display that no barcode was detected if (!result.items.length) - this.resultsContainer!.nativeElement.innerText += + this.resultText += 'No barcode found\n'; } } catch (ex: any) { diff --git a/hello-world/blazor/README.md b/hello-world/blazor/README.md index aae77471..b44e2205 100644 --- a/hello-world/blazor/README.md +++ b/hello-world/blazor/README.md @@ -156,6 +156,8 @@ window.startVideoDecode = async () => { // Open camera and start scanning single barcode. await cameraEnhancer.open(); + + cameraView.setScanLaserVisible(true); await cvRouter.startCapturing("ReadSingleBarcode"); } catch (ex) { let errMsg = ex.message || ex; @@ -283,45 +285,43 @@ Inside the `wwwroot\index.html` file, we will initialize the license and necessa - - + ``` diff --git a/hello-world/electron/README.md b/hello-world/electron/README.md index fe4a8715..f51aba6d 100644 --- a/hello-world/electron/README.md +++ b/hello-world/electron/README.md @@ -18,12 +18,13 @@ In this guide, we will be using [`dynamsoft-barcode-reader-bundle 10.4.2002`](ht Make sure you have [node](https://nodejs.org/) installed. `node 16.20.1` and `electron 26.4.1` are used in this article. -## Quick Start +## Quick Start ```cmd npm install npm start ``` + A window should open to view the sample application ## Creating the sample project @@ -148,14 +149,14 @@ Dynamsoft.Core.CoreModule.engineResourcePaths = { license: "./node_modules/dynamsoft-license/dist/", cvr: "./node_modules/dynamsoft-capture-vision-router/dist/", dbr: "./node_modules/dynamsoft-barcode-reader/dist/", - dce: "./node_modules/dynamsoft-camera-enhancer/dist/" + dce: "./node_modules/dynamsoft-camera-enhancer/dist/", }; /** LICENSE ALERT - README * To use the library, you need to first specify a license key using the API "initLicense()" as shown below. */ -Dynamsoft.License.LicenseManager.initLicense('DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9', { +Dynamsoft.License.LicenseManager.initLicense("DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9", { executeNow: true, }); @@ -170,15 +171,18 @@ Dynamsoft.License.LicenseManager.initLicense('DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMD Dynamsoft.Core.CoreModule.loadWasm(["DBR"]); (async () => { + // Defined globally for easy debugging. + let cameraEnhancer, cvRouter; + try { - // Create a `CameraEnhancer` instance for camera control and a `CameraView` instance for UI control. + // Create a `CameraView` instance for UI control and a `CameraEnhancer` instance for camera control. const cameraView = await Dynamsoft.DCE.CameraView.createInstance(); - const cameraEnhancer = await Dynamsoft.DCE.CameraEnhancer.createInstance(cameraView); + cameraEnhancer = await Dynamsoft.DCE.CameraEnhancer.createInstance(cameraView); // Get default UI and append it to DOM. document.querySelector("#camera-view-container").append(cameraView.getUIElement()); // Create a `CaptureVisionRouter` instance and set `CameraEnhancer` instance as its image source. - const cvRouter = await Dynamsoft.CVR.CaptureVisionRouter.createInstance(); + cvRouter = await Dynamsoft.CVR.CaptureVisionRouter.createInstance(); cvRouter.setInput(cameraEnhancer); // Define a callback for results. @@ -187,12 +191,12 @@ Dynamsoft.Core.CoreModule.loadWasm(["DBR"]); if (!result.barcodeResultItems.length) return; const resultsContainer = document.querySelector("#results"); - resultsContainer.textContent = ''; + resultsContainer.textContent = ""; console.log(result); for (let item of result.barcodeResultItems) { resultsContainer.textContent += `${item.formatString}: ${item.text}\n\n`; } - } + }, }); // Filter out unchecked and duplicate results. @@ -205,6 +209,7 @@ Dynamsoft.Core.CoreModule.loadWasm(["DBR"]); // Open camera and start scanning single barcode. await cameraEnhancer.open(); + cameraView.setScanLaserVisible(true); await cvRouter.startCapturing("ReadSingleBarcode"); } catch (ex) { let errMsg = ex.message || ex; @@ -221,22 +226,12 @@ Dynamsoft.Core.CoreModule.loadWasm(["DBR"]); Create the `style.css` file at the root folder. Note that this is customizable! ```css -body { - text-align: center; -} - -#camera-view-container { - width: 100%; - height: 80vh; -} - #results { width: 100%; height: 10vh; overflow: auto; white-space: pre-wrap; } - ``` ## Run the application diff --git a/hello-world/next/README.md b/hello-world/next/README.md index 8f5f8ad0..828f4dec 100644 --- a/hello-world/next/README.md +++ b/hello-world/next/README.md @@ -111,17 +111,18 @@ CoreModule.loadWasm(["DBR"]); ```tsx /* /components/VideoCapture/VideoCapture.tsx */ -import React, { useEffect, useRef } from "react"; +import React, { useEffect, useRef, useState } from "react"; import "../../dynamsoft.config"; // import side effects. The license, engineResourcePath, so on. import { CameraEnhancer, CameraView } from "dynamsoft-camera-enhancer"; import { CaptureVisionRouter } from "dynamsoft-capture-vision-router"; import { MultiFrameResultCrossFilter } from "dynamsoft-utility"; +import "./VideoCapture.css"; const componentDestroyedErrorMsg = "VideoCapture Component Destroyed"; function VideoCapture() { const cameraViewContainer = useRef(null); - const resultsContainer = useRef(null); + const [resultsText, setResultText] = useState(""); useEffect((): any => { let resolveInit: () => void; @@ -160,11 +161,12 @@ function VideoCapture() { onDecodedBarcodesReceived: (result) => { if (!result.barcodeResultItems.length) return; - resultsContainer.current!.textContent = ""; + let _resultText = ""; console.log(result); for (let item of result.barcodeResultItems) { - resultsContainer.current!.textContent += `${item.formatString}: ${item.text}\n\n`; + _resultText += `${item.formatString}: ${item.text}\n\n`; } + setResultText(_resultText); }, }); @@ -181,6 +183,7 @@ function VideoCapture() { // Open camera and start scanning single barcode. await cameraEnhancer.open(); + cameraView.setScanLaserVisible(true); if (isDestroyed) { throw Error(componentDestroyedErrorMsg); } @@ -224,9 +227,9 @@ function VideoCapture() { background: "#eee", }} > - Results:
-
+ Results: +
{resultsText}
); } @@ -237,7 +240,7 @@ export default VideoCapture; > Note: > > * The component should never update so that events bound to the UI stay valid. In this component, the useEffect() hook is used to handle the component’s mount and unmount lifecycle events, and there are no state updates that would cause a re-render. -> * If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customize-the-ui) +> * If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customizing-the-ui) ### Create and edit the `ImageCapture` component @@ -247,14 +250,15 @@ export default VideoCapture; ```tsx /* /components/ImageCapture/ImageCapture.tsx */ -import React, { useRef, useEffect, MutableRefObject } from "react"; +import React, { useRef, useEffect, MutableRefObject, useState } from "react"; import "../../dynamsoft.config"; // import side effects. The license, engineResourcePath, so on. import { EnumCapturedResultItemType } from "dynamsoft-core"; import { BarcodeResultItem } from "dynamsoft-barcode-reader"; import { CaptureVisionRouter } from "dynamsoft-capture-vision-router"; +import "./ImageCapture.css"; function ImageCapture() { - const resultsContainer: MutableRefObject = useRef(null); + const [resultText, setResultText] = useState(""); let pCvRouter: MutableRefObject | null> = useRef(null); let isDestroyed = useRef(false); @@ -262,7 +266,7 @@ function ImageCapture() { const captureImage = useCallback(async (e: React.ChangeEvent) => { let files = [...(e.target.files as any as File[])]; e.target.value = ""; // reset input - resultsContainer.current!.innerText = ""; + let _resultText = ""; try { // ensure cvRouter is created only once @@ -270,24 +274,26 @@ function ImageCapture() { if (isDestroyed.current) return; for (let file of files) { - // Decode selected image with 'ReadBarcodes_SpeedFirst' template. - const result = await cvRouter.capture(file, "ReadBarcodes_SpeedFirst"); + // Decode selected image with 'ReadBarcodes_ReadRateFirst' template. + const result = await cvRouter.capture(file, "ReadBarcodes_ReadRateFirst"); + console.log(result); if (isDestroyed.current) return; + let _resultText = ""; // Print file name if there's multiple files if (files.length > 1) { - resultsContainer.current!.innerText += `\n${file.name}:\n`; + _resultText += `\n${file.name}:\n`; } for (let _item of result.items) { if (_item.type !== EnumCapturedResultItemType.CRIT_BARCODE) { continue; // check if captured result item is a barcode } let item = _item as BarcodeResultItem; - resultsContainer.current!.innerText += item.text + "\n"; // output the decoded barcode text - console.log(item.text); + _resultText += item.text + "\n"; // output the decoded barcode text } // If no items are found, display that no barcode was detected - if (!result.items.length) resultsContainer.current!.innerText += "No barcode found"; + if (!result.items.length) _resultText = "No barcode found"; + setResultText(_resultText); } } catch (ex: any) { let errMsg = ex.message || ex; @@ -316,7 +322,7 @@ function ImageCapture() {
-
+
{resultText}
); } diff --git a/hello-world/nuxt/README.md b/hello-world/nuxt/README.md index f387d301..150e8daa 100644 --- a/hello-world/nuxt/README.md +++ b/hello-world/nuxt/README.md @@ -110,7 +110,7 @@ import { MultiFrameResultCrossFilter } from "dynamsoft-utility"; const componentDestroyedErrorMsg = "VideoCapture Component Destroyed"; const cameraViewContainer: Ref = ref(null); -const resultsContainer: Ref = ref(null); +const resultText = ref(""); let resolveInit: () => void; const pInit: Promise = new Promise(r => { resolveInit = r }); @@ -142,10 +142,10 @@ onMounted(async () => { onDecodedBarcodesReceived: (result) => { if (!result.barcodeResultItems.length) return; - resultsContainer.value!.textContent = ''; + resultText.value = ''; console.log(result); for (let item of result.barcodeResultItems) { - resultsContainer.value!.textContent += `${item.formatString}: ${item.text}\n\n`; + resultText.value += `${item.formatString}: ${item.text}\n\n`; } } }); @@ -161,6 +161,7 @@ onMounted(async () => { // Open camera and start scanning single barcode. await cameraEnhancer.open(); + cameraView.setScanLaserVisible(true); if (isDestroyed) { throw Error(componentDestroyedErrorMsg); } await cvRouter.startCapturing("ReadSingleBarcode"); if (isDestroyed) { throw Error(componentDestroyedErrorMsg); } @@ -196,13 +197,22 @@ onBeforeUnmount(async () => {

Results: -
+
{{ resultText }}
+ + ``` > Note: > -> If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customize-the-ui) +> If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customizing-the-ui) ### Edit the `ImageCapture` component @@ -217,7 +227,7 @@ import { EnumCapturedResultItemType } from "dynamsoft-core"; import type { BarcodeResultItem } from "dynamsoft-barcode-reader"; import { CaptureVisionRouter } from "dynamsoft-capture-vision-router"; -const resultContainer: Ref = ref(null); +const resultText = ref(""); let pCvRouter: Promise; let isDestroyed = false; @@ -225,31 +235,31 @@ let isDestroyed = false; const captureImage = async (e: Event) => { let files = [...(e.target! as HTMLInputElement).files!]; (e.target! as HTMLInputElement).value = ''; // reset input - resultContainer.value!.innerText = ""; + resultText.value = ""; try { // ensure cvRouter is created only once const cvRouter = await (pCvRouter = pCvRouter || CaptureVisionRouter.createInstance()); if (isDestroyed) return; for (let file of files) { - // Decode selected image with 'ReadBarcodes_SpeedFirst' template. - const result = await cvRouter.capture(file, "ReadBarcodes_SpeedFirst"); + // Decode selected image with 'ReadBarcodes_ReadRateFirst' template. + const result = await cvRouter.capture(file, "ReadBarcodes_ReadRateFirst"); + console.log(result); if (isDestroyed) return; // Print file name if there's multiple files if (files.length > 1) { - resultContainer.value!.innerText += `\n${file.name}:\n`; + resultText.value += `\n${file.name}:\n`; } for (let _item of result.items) { if (_item.type !== EnumCapturedResultItemType.CRIT_BARCODE) { continue; // check if captured result item is a barcode } let item = _item as BarcodeResultItem; - resultContainer.value!.innerText += item.text + "\n"; // output the decoded barcode text - console.log(item.text); + resultText.value += item.text + "\n"; // output the decoded barcode text } // If no items are found, display that no barcode was detected - if (!result.items.length) resultContainer.value!.innerText += 'No barcode found\n'; + if (!result.items.length) resultText.value += 'No barcode found\n'; } } catch (ex: any) { let errMsg = ex.message || ex; @@ -273,9 +283,32 @@ onBeforeUnmount(async () => {
-
+
{{resultText}}
+ + ``` ### Add `VideoCapture` and `ImageCapture` components in `app.vue` @@ -290,6 +323,7 @@ onBeforeUnmount(async () => {

Hello World for NuxtJS

+
); } @@ -310,8 +316,10 @@ export default ImageCapture; ```tsx /* /src/App.tsx */ import { useState } from "react"; +import reactLogo from "./assets/logo.svg"; import VideoCapture from "./components/VideoCapture/VideoCapture"; import ImageCapture from "./components/ImageCapture/ImageCapture"; +import "./App.css"; enum Modes { VIDEO_CAPTURE = "video", @@ -329,6 +337,7 @@ function App() {

Hello World for React

+ logo
); } @@ -221,7 +226,7 @@ export default VideoCapture; > * The component should never update (check the code for `shouldComponentUpdate()`) so that events bound to the UI stay valid. > * Also, during 'development', React executes setup and cleanup phases twice in [Strict Mode](https://react.dev/reference/react/StrictMode). To ensure proper functioning of VideoCapture in development, it's advised to avoid using Strict Mode for this component. > However, if you're still interested on using Strict Mode, we do have a workaround available. Please contact our [support team](#Support) for further assistance. -> * If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customize-the-ui) +> * If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customizing-the-ui) ### Create and edit the `ImageCapture` component @@ -236,6 +241,7 @@ import "../../dynamsoft.config"; // import side effects. The license, engineReso import { EnumCapturedResultItemType } from "dynamsoft-core"; import type { BarcodeResultItem } from "dynamsoft-barcode-reader"; import { CaptureVisionRouter } from "dynamsoft-capture-vision-router"; +import "./ImageCapture.css"; class ImageCapture extends React.Component { resultsContainer: React.RefObject = React.createRef(); @@ -253,8 +259,9 @@ class ImageCapture extends React.Component { if (this.isDestroyed) return; for (let file of files) { - // Decode selected image with 'ReadBarcodes_SpeedFirst' template. - const result = await cvRouter.capture(file, "ReadBarcodes_SpeedFirst"); + // Decode selected image with 'ReadBarcodes_ReadRateFirst' template. + const result = await cvRouter.capture(file, "ReadBarcodes_ReadRateFirst"); + console.log(result); if (this.isDestroyed) return; // Print file name if there's multiple files @@ -267,7 +274,6 @@ class ImageCapture extends React.Component { } let item = _item as BarcodeResultItem; this.resultsContainer.current!.innerText += item.text + "\n"; - console.log(item.text); } // If no items are found, display that no barcode was detected if (!result.items.length) this.resultsContainer.current!.innerText += "No barcode found\n"; @@ -317,9 +323,11 @@ export default ImageCapture; ```tsx /* src/App.tsx */ import React from "react"; +import reactLogo from "./assets/logo.svg"; import "./dynamsoft.config"; // import side effects. The license, engineResourcePath, so on. import VideoCapture from "./components/VideoCapture/VideoCapture"; import ImageCapture from "./components/ImageCapture/ImageCapture"; +import "./App.css"; enum Modes { VIDEO_CAPTURE = "video", @@ -348,6 +356,7 @@ class App extends React.Component {

Hello World for React

+ logo
``` diff --git a/hello-world/vue/README.md b/hello-world/vue/README.md index c6a64953..8411f59e 100644 --- a/hello-world/vue/README.md +++ b/hello-world/vue/README.md @@ -118,7 +118,6 @@ import { MultiFrameResultCrossFilter } from "dynamsoft-utility"; const componentDestroyedErrorMsg = "VideoCapture Component Destroyed"; const cameraViewContainer: Ref = ref(null); -const resultsContainer: Ref = ref(null); let resolveInit: () => void; const pInit: Promise = new Promise(r => { resolveInit = r }); @@ -126,9 +125,9 @@ let isDestroyed = false; let cvRouter: CaptureVisionRouter; let cameraEnhancer: CameraEnhancer; +let resultText = ref(""); onMounted(async () => { - try { // Create a `CameraEnhancer` instance for camera control and a `CameraView` instance for UI control. const cameraView = await CameraView.createInstance(); @@ -150,10 +149,10 @@ onMounted(async () => { onDecodedBarcodesReceived: (result) => { if (!result.barcodeResultItems.length) return; - resultsContainer.value!.textContent = ''; + resultText.value = ''; console.log(result); for (let item of result.barcodeResultItems) { - resultsContainer.value!.textContent += `${item.formatString}: ${item.text}\n\n`; + resultText.value += `${item.formatString}: ${item.text}\n\n`; } } }); @@ -169,6 +168,7 @@ onMounted(async () => { // Open camera and start scanning single barcode. await cameraEnhancer.open(); + cameraView.setScanLaserVisible(true); if (isDestroyed) { throw Error(componentDestroyedErrorMsg); } await cvRouter.startCapturing("ReadSingleBarcode"); if (isDestroyed) { throw Error(componentDestroyedErrorMsg); } @@ -204,13 +204,13 @@ onBeforeUnmount(async () => {

Results: -
+
{{ resultText }}
``` > Note: > -> If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customize-the-ui) +> If you're looking to customize the UI, the UI customization feature are provided by the auxiliary SDK "Dynamsoft Camera Enhancer". For more details, refer to our [User Guide](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/index.html#customizing-the-ui) ### Create and edit the `ImageCapture` component @@ -221,45 +221,44 @@ onBeforeUnmount(async () => { ```vue