翻譯|使用教程|編輯:楊鵬連|2020-10-28 11:04:05.170|閱讀 291 次
概述:在本文中,我將演示如何創(chuàng)建一個簡單的Web畫布區(qū)域選擇工具,以使用Dynamsoft JavaScript Barcode SDK進(jìn)行條形碼區(qū)域檢測。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Dynamsoft Barcode Reader SDK一款多功能的條碼讀取控件,只需要幾行代碼就可以將條碼讀取功能嵌入到Web或桌面應(yīng)用程序。這可以節(jié)省數(shù)月的開發(fā)時間和成本。能支持多種圖像文件格式以及從攝像機或掃描儀獲取的DIB格式。使用Dynamsoft Barcode Reader SDK,你可以創(chuàng)建強大且實用的條形碼掃描儀軟件,以滿足你的業(yè)務(wù)需求。
點擊下載Dynamsoft Barcode Reader最新版
條形碼定位算法是圖像中條形碼識別的必要步驟。但是,對于靜態(tài)圖像,圖像尺寸越大,算法花費的時間就越多。另外,算法的成功率可能會受到背景色和前景色的干擾。很難保證100%的條形碼定位成功率。如果自動檢測失敗,可行的解決方法是切換到手動模式,用肉眼選擇條形碼區(qū)域,以便識別所需的條形碼。在本文中,我將演示如何創(chuàng)建一個簡單的Web畫布區(qū)域選擇工具,以使用Dynamsoft JavaScript Barcode SDK進(jìn)行條形碼區(qū)域檢測。
畫布區(qū)域選擇
區(qū)域選擇步驟包括:
<style> #container { position: relative; } #imageCanvas { position: relative; z-index: 1; } #overlay { position: absolute; top: 0; left: 0; z-index: 2 } </style> <div id="container"> <canvas id="imageCanvas"> </canvas> <canvas id="overlay"></canvas> </div>首先,使用FileReader()加載圖像文件并將其繪制在圖像畫布上:
<input type="file" id="barcode-file" onchange="loadfile()" accept=".jpg,.jpeg,.png,.bmp" /> function loadfile() { let img = new Image(); var reader = new FileReader(); reader.onload = function (evt) { img.onload = function () { if (img.width > maxLength) { img.height = maxLength * img.height / img.width img.width = maxLength; } else if (img.height > maxLength) { img.width = maxLength * img.width / img.height img.height = maxLength; } canvas.width = img.width; canvas.height = img.height; overlay.width = canvas.width; overlay.height = canvas.height; context.drawImage(img, 0, 0, img.width, img.height); }; img.src = evt.target.result; }; reader.readAsDataURL(name.files[0]); }您可以定義最大尺寸,以防圖像尺寸太大。
接下來,您可以將鼠標(biāo)事件偵聽器添加到覆蓋畫布。需要三個鼠標(biāo)事件:mousedown,mousemove和mouseup:
function clearOverlay() { overlayCtx.clearRect(0, 0, overlay.width, overlay.height); overlayCtx.strokeStyle = '#ff0000'; overlayCtx.lineWidth = 5; } overlay.addEventListener('mousedown', e => { startX = e.offsetX; startY = e.offsetY; isDrawing = true; clearOverlay(); overlay.style.cursor = "crosshair"; }); overlay.addEventListener('mousemove', e => { if (isDrawing) { clearOverlay(); overlayCtx.beginPath(); overlayCtx.rect(startX, startY, e.offsetX - startX, e.offsetY - startY); overlayCtx.stroke(); } mousePosition.innerHTML = "Cursor: (" + e.offsetX + ", " + e.offsetY + ")"; }); overlay.addEventListener('mouseup', e => { if (isDrawing) { isDrawing = false; mousePosition.innerHTML = "Cursor: (" + e.offsetX + ", " + e.offsetY + ")"; region.innerHTML = "Decode a region: (" + startX + ", " + startY + ", " + e.offsetX + ", " + e.offsetY + "). "; overlay.style.cursor = "default"; } });至此,畫布區(qū)域選擇功能已經(jīng)完成。拖動光標(biāo)時,將在圖像上方繪制一個矩形。在下面的段落中,您將看到如何對選定區(qū)域進(jìn)行條形碼區(qū)域檢測。
條形碼區(qū)域檢測
為了進(jìn)行比較,您可以首先從完整圖像中解碼條形碼。Dynamsoft JavaScript解碼API支持多種數(shù)據(jù)類型作為輸入源,例如文件對象,Blob,Buffer,ArrayBuffer,Uint8Array,Uint8ClampedArray,HTMLImageElement,HTMLCanvasElement,HTMLVideoElement和字符串:
(async () => { await barcodereader.resetRuntimeSettings(); await barcodereader.updateRuntimeSettings('coverage'); // Mode: speed, balance, coverage try { await barcodereader.decode(name.files[0]).then((results) => { let txts = []; try { for (let i = 0; i < results.length; ++i) { txts.push(results[i].BarcodeText); } let barcoderesults = txts.join(', '); } catch (e) { } }); } catch (error) { alert(error); } })();
overlay.addEventListener('mouseup', e => { if (isDrawing) { isDrawing = false; mousePosition.innerHTML = "Cursor: (" + e.offsetX + ", " + e.offsetY + ")"; region.innerHTML = "Decode a region: (" + startX + ", " + startY + ", " + e.offsetX + ", " + e.offsetY + "). "; overlay.style.cursor = "default"; // Decode a region of the barcode image (async () => { let settings = await barcodereader.getRuntimeSettings(); settings.region.regionLeft = startX * 100 / overlay.width; settings.region.regionTop = startY * 100 / overlay.height; settings.region.regionRight = e.offsetX * 100 / overlay.width; settings.region.regionBottom = e.offsetY * 100 / overlay.height; settings.region.regionMeasuredByPercentage = 1; barcodereader.updateRuntimeSettings(settings); try { let decodingStart = Date.now(); await barcodereader.decode(name.files[0]).then((results) => { let decodingEnd = Date.now(); let txts = []; try { for (let i = 0; i < results.length; ++i) { txts.push(results[i].BarcodeText); } let barcoderesults = txts.join(', '); catch (e) { } }); } catch (error) { alert(error); } })(); } });由于您可能已經(jīng)縮放了圖像,因此可以設(shè)置百分比而不是實際坐標(biāo)值。regionMeasuredByPercentage的值 必須為1。
現(xiàn)在,您可以在網(wǎng)絡(luò)瀏覽器中測試條形碼區(qū)域檢測應(yīng)用程序。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: