条形码区域解码:Web小工具
条形码解码首先要做定位 , 找到条形码在图像中的区域 。 但是有时候受图像质量影响 , 算法找寻的区域可能产生偏差 , 最后导致解码失败 。 这个时候 , 可以尝试手动选择区域 , 来辅助条形码的识别 。
Web Canvas框选识别条形码需求:
- 在网页中加载条形码图像 。
- 使用鼠标框选出条形码的区域 。
- 识别区域中的条形码 。
【条形码区域解码:Web小工具】
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.widthimg.width = maxLength;}else if (img.height > maxLength) {img.width = maxLength * img.width / img.heightimg.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 = http://kandian.youth.cn/index/evt.target.result;};reader.readAsDataURL(name.files[0]);}
鼠标框选矩形区域要在图像上面绘制出一个矩形框 , 需要创建另外一个canvas , 并把它放置到图像的上面:#container {position: relative;}#imageCanvas {position: relative;z-index: 1;}#overlay {position: absolute;top: 0;left: 0;z-index: 2}
接下来监听鼠标事件 , 在鼠标移动的时候绘制矩形: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";}});
条形码识别在鼠标左键抬起的时候 , 可以获得矩形最终的区域 。 把这个区域设置到接口中: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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 天津津门湖、武清高铁站、天津站三个重点区域将建新能源车充换电示范站
- 测试|自动驾驶车辆将在深圳19个公开区域路测
- 四个维度解析区域发展与治理
- 8K解码无压力,当贝超级电视盒子B3 Pro评测
- 搭5G+智慧医疗快车|唐山市人民医院医疗集团携手中国电信打造区域影像、脑卒中协同救治信息一体化平台
- 西安各区县举办多类型活动 抢抓区域科技创新发展高地
- 深入理解Netty编解码、粘包拆包、心跳机制
- 开机无广告真清爽!当贝超级盒子B3 Pro评测:体验8K解码堆料旗舰
- 发现新“齐迹”| 科技之光辉耀齐鲁 助推区域高质量发展
- 网络|2022年郑州实现5G网络乡镇以上区域连续覆盖