使用 HTML5 和 Web 浏览器进行 Webcam 条形码扫描
如何构建用于云服务的网络摄像头条形码扫描器? 将 Dynamic Barcode Reader SDK 部署到您的 Web 服务器(IIS、Apache、Nginx 等)。 在任何支持 HTML5 的 Web 浏览器中持续捕获网络摄像头中的图像,并将 base64 编码的图像数据发送到云条形码服务进行检测。
引言
随着互联网连接速度越来越快,越来越多的人倾向于拥抱云服务。 任何桌面应用程序都可以转换为云应用程序,从而具有更好的可维护性、安全性和稳定性。 最终用户可以使用 Web 浏览器与社交朋友联系、存储大量个人数据、观看直播视频、编辑文档、发布博客文章甚至编写代码。 在本文中,我们将简要了解如何使 Dynamic Barcode Reader SDK 与 Web 技术配合使用。 您将看到一个基于云的条形码扫描器,它由网络摄像头、支持 HTML5 的 Web 浏览器、IIS Web 服务器和 .NET 条形码阅读器 SDK 组成。
为什么选择 Dynamsoft Barcode Reader
支持的 1D/2D 条码类型
- 1D:Code 39, Code 93, Code 128, Codabar, EAN-8, EAN-13, UPC-A, UPC-E, Interleaved 2 of 5 (ITF), Industrial 2 of 5 (Code 2 of 5 Industry, Standard 2 of 5, Code 2 of 5), ITF-14
- 2D:QRCode, DataMatrix 和 PDF417
支持的图像类型
- BMP、JPEG、PNG、GIF、TIFF 和 PDF
检测到的条码信息
- 条码类型
- 条形码计数
- 条码值(字符串形式)
- 条码原始数据(字节形式)
- 条码边界矩形
- 四个角的坐标
- 页码
特点
- 准确:读取选定图像的指定区域内的条形码。
- 有效:读取一个图像中的多个条形码。
- 强大:读取质量差和损坏的条形码。
- 灵活:以任何方向和旋转角度检测条形码。
支持的编程语言
- C#、VB.net、Java、C++、PHP、JavaScript、Python 等。
网络摄像头条形码扫描器的实现
测试环境
Microsoft Edge、Firefox、Chrome 和 Opera。
示例代码的剖析
- 打开 Visual Studio 创建一个新的 Web 项目。
- 单击引用以导入 Dynamsoft.BarcodeReader.dll。
- 创建一个 C# 类
BarrecodeReaderRepo
以处理服务器端的条形码检测
using System; using System.Drawing; using System.IO; using Dynamsoft.Barcode; namespace BarcodeDLL { public class BarrecodeReaderRepo { private static readonly char CSep = Path.DirectorySeparatorChar; private static readonly string StrPath = AppDomain.CurrentDomain.BaseDirectory + "Images"; private static readonly string CollectFolder = StrPath + CSep + "Collect"; public static string Barcode(string strImgBase64, Int64 iformat, int iMaxNumbers, ref string strResult) { if (string.IsNullOrEmpty(strImgBase64.Trim())) throw new Exception("No barcode exist."); return DoBarcode(strImgBase64, iformat, iMaxNumbers, ref strResult); } private static string DoBarcode(string strImgBase64, Int64 format, int iMaxNumbers, ref string strResult) { strResult = ""; var strResturn = "["; var listResult = GetBarcode(strImgBase64, format, iMaxNumbers); if (listResult == null || listResult.Length == 0) { strResult = "No barcode found. "; return "[]"; } strResult = "Total barcode(s) found: " + listResult.Length + ""; var i = 1; foreach (var item in listResult) { strResult = strResult + "  Barcode " + i + ":"; strResult = strResult + "    Type: " + item.BarcodeFormat + ""; strResult = strResult + "    Value: " + item.BarcodeText + ""; strResult = strResult + "    Region: {Left: " + item.ResultPoints[0].X + ", Top: " + item.ResultPoints[0].Y + ", Width: " + item.BoundingRect.Width + ", Height: " + item.BoundingRect.Height + "}"; i++; } strResturn = strResturn.Substring(0, strResturn.Length - 1); strResturn += "]"; return strResturn; } public static BarcodeResult[] GetBarcode(string strImgBase64, Int64 format, int iMaxNumbers) { var reader = new Dynamsoft.Barcode.BarcodeReader(); var options = new ReaderOptions { MaxBarcodesToReadPerPage = iMaxNumbers, BarcodeFormats = (BarcodeFormat) format }; reader.ReaderOptions = options; reader.LicenseKeys = "693C401F1CC972A511F060EA05D537CD"; return reader.DecodeBase64String(strImgBase64); } } }
- 创建一个通用处理程序 WebcamBarcodeReader.ashx 来处理 HTTP 请求。 解析流以获取 base64 字符串,然后将其传递给
BarrecodeReaderRepo
public class WebcamBarcodeReader : IHttpHandler { public void ProcessRequest(HttpContext context) { try { // 1. Get Base64 Stream context.Request.InputStream.Position = 0; string jsonString; using (var inputStream = new StreamReader(context.Request.InputStream)) { jsonString = inputStream.ReadToEnd(); } var postData = JsonConvert.DeserializeObject<PostData>(@jsonString); if (postData == null) return; // 2. reader barcode and output result var strResult = ""; BarrecodeReaderRepo.Barcode(postData.Base64Data, postData.BarcodeType, 10, ref strResult); if (strResult.IndexOf("No barcode found", StringComparison.Ordinal) == -1) { strResult = "|" + strResult; } strResult += DateTime.Now; context.Response.Write(strResult); } catch (Exception exp) { context.Response.Write("Error: " + exp.Message); } } public bool IsReusable { get { return true; } } public class PostData { public string Base64Data { get; set; } public int BarcodeType { get; set; } } }
- 创建一个元素
<video></video>
。 使用 HTML5 APIgetUserMedia
在网页中打开网络摄像头
function toggleCamera() { var videoSource = videoSelect.value; var constraints = { video: { optional: [{ sourceId: videoSource }] } }; startCamera(constraints); } // Start camera preview on <video></video> function successCallback(stream) { window.stream = stream; videoElement.src = window.URL.createObjectURL(stream); videoElement.play(); } function errorCallback(error) { console.log("Error: " + error); } function startCamera(constraints) { if (navigator.getUserMedia) { navigator.getUserMedia(constraints, successCallback, errorCallback); } else { console.log("getUserMedia not supported"); } }
- 如何将预览图像发送到远程服务器? 在隐藏的画布上不断绘制帧。 将画布数据转换为
base64
字符串并在 Ajax 中发送。 如果未检测到任何内容,请使用方法setTimeout
再次发送预览数据以进行检测
context.drawImage(videoElement, 0, 0, width, height); // convert canvas to base64 var base64 = dbrCanvas.toDataURL('image/png', 1.0); var data = base64.replace(/^data:image\/(png|jpeg|jpg);base64,/, ""); var imgData = JSON.stringify({ Base64Data: data, BarcodeType: getBarcodeFormat() }); $.ajax({ url: 'WebcamBarcodeReader.ashx', dataType: 'json', data: imgData, type: 'POST', complete: function (result) { console.log(result); if (isPaused) { return; } var barcode_result = document.getElementById('dbr'); var aryResult; aryResult = result.responseText.split('|'); // display barcode result if (result.responseText.indexOf("No barcode") == -1) { resetButtonGo(); barcode_result.innerHTML = result.responseText.substring(aryResult[0].length + 1); } else { barcode_result.innerHTML = result.responseText; setTimeout(scanBarcode, 200); } } });
在线演示
立即尝试!
获取 SDK 和示例
对上述网络摄像头条形码扫描器演示感兴趣吗? 下载 Dynamic Barcode Reader 的 30 天免费试用版来构建您的条形码应用程序。
Dynamic Barcode Reader 30 天免费试用
有关如何使用 Dynamic Barcode Reader SDK 的更多示例,请访问以下页面
Dynamic Barcode Reader 演示
再一点
Dynamsoft Barcode Reader SDK 不仅适用于 Windows,还适用于 Linux 和 Mac OS X。 您可以在自己喜欢的平台上尽情使用它。 如果您有任何疑问,请随时联系 support@dynamsoft.com。