Default.aspx.cs
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } }
FlashCamera.aspx.cs
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.IO; //For MemoryStream using System.Web.Services; //For WebMethod attribute using Bytescout.BarCodeReader; using System.Web.UI.HtmlControls; using System.Drawing; using System.Drawing.Imaging; using System.Threading; public partial class uploadimage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { try { String send = ""; System.Drawing.Image originalimg; // read barcode type set String type = Request.QueryString["type"].ToString(); MemoryStream log = new MemoryStream(); byte[] buffer = new byte[1024]; int c; // read input buffer with image and saving into the "log" memory stream while ((c = Request.InputStream.Read(buffer, 0, buffer.Length)) > 0) { log.Write(buffer, 0, c); } // create image object originalimg = System.Drawing.Image.FromStream(log); // resample image originalimg = originalimg.GetThumbnailImage(640, 480, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero); Bitmap bp = new Bitmap(originalimg); // create bytescout barcode reader object Reader reader = new Reader(); // set barcode type to read reader.BarcodeTypesToFind = GetBarcodeTypeToFindFromCombobox(type); // read barcodes from image reader.ReadFrom(bp); // if there are any result then convert them into a single stream if (reader.FoundBarcodes != null) { foreach (FoundBarcode barcode in reader.FoundBarcodes) { // form the output string send = send + (String.Format("{0} : {1}", barcode.Type, barcode.Value)); } } // close the memory stream log.Close(); // dispose the image object originalimg.Dispose(); // write output Response.Write("<d>" + send + "</d>"); } catch (Exception ex) { // write the exception if any Response.Write("<d>" + ex + "</d>"); } } public bool ThumbnailCallback() { return false; } /// <summary> /// Get symbology filter for the SDK from the combobox selection text /// </summary> /// <param name="barType"></param> /// <returns></returns> private static BarcodeTypeSelector GetBarcodeTypeToFindFromCombobox(string barType) { string selectedItemText = barType.Trim().ToUpper(); BarcodeTypeSelector barcodeTypeToScan = new BarcodeTypeSelector(); if (selectedItemText.IndexOf("ALL BARCODES") > -1) barcodeTypeToScan.SetAll(); else if (selectedItemText.IndexOf("ALL LINEAR BARCODES") > -1) barcodeTypeToScan.SetAll1D(); else if (selectedItemText.IndexOf("ALL 2D BARCODES") > -1) barcodeTypeToScan.SetAll2D(); else if (selectedItemText.IndexOf("AZTEC") > -1) barcodeTypeToScan.Aztec = true; else if (selectedItemText.IndexOf("CODABAR") > -1) barcodeTypeToScan.Codabar = true; else if (selectedItemText.IndexOf("CODE 39") > -1) barcodeTypeToScan.Code39 = true; else if (selectedItemText.IndexOf("CODE 128") > -1) barcodeTypeToScan.Code128 = true; else if (selectedItemText.IndexOf("DATAMATRIX") > -1) barcodeTypeToScan.DataMatrix = true; else if (selectedItemText.IndexOf("EAN 13") > -1) barcodeTypeToScan.EAN13 = true; else if (selectedItemText.IndexOf("GS1-128") > -1) barcodeTypeToScan.GS1 = true; else if (selectedItemText.IndexOf("GS1DATABAREXPANDED") > -1) barcodeTypeToScan.GS1DataBarExpanded = true; else if (selectedItemText.IndexOf("GS1DATABAREXPANDEDSTACKED") > -1) barcodeTypeToScan.GS1DataBarExpandedStacked = true; else if (selectedItemText.IndexOf("GS1DATABARLIMITED") > -1) barcodeTypeToScan.GS1DataBarLimited = true; else if (selectedItemText.IndexOf("GS1DATABAROMNIDIRECTIONAL") > -1) barcodeTypeToScan.GS1DataBarOmnidirectional = true; else if (selectedItemText.IndexOf("GS1DATABARSTACKED") > -1) barcodeTypeToScan.GS1DataBarStacked = true; else if (selectedItemText.IndexOf("I2OF5") > -1) barcodeTypeToScan.Interleaved2of5 = true; else if (selectedItemText.IndexOf("PATCH") > -1) barcodeTypeToScan.PatchCode = true; else if (selectedItemText.IndexOf("PDF 417") > -1) barcodeTypeToScan.PDF417 = true; else if (selectedItemText.IndexOf("QR CODE") > -1) barcodeTypeToScan.QRCode = true; else if (selectedItemText.IndexOf("UPCA") > -1) barcodeTypeToScan.UPCA = true; else if (selectedItemText.IndexOf("UPCE") > -1) barcodeTypeToScan.UPCE = true; else if (selectedItemText.IndexOf("MAXICODE") > -1) barcodeTypeToScan.MaxiCode = true; return barcodeTypeToScan; } }
HTML5Camera.aspx.cs
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.IO; //For MemoryStream using System.Web.Services; //For WebMethod attribute using Bytescout.BarCodeReader; using System.Web.UI.HtmlControls; using System.Drawing; using System.Drawing.Imaging; using System.Threading; using System.Text; public partial class Camera : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } /// <summary> /// Takes the base64 encoded image from the browser /// and tries to read barodes from it /// </summary> /// <param name="image"></param> /// <param name="type"></param> /// <returns></returns> [WebMethod] public static string Upload(string image, string type) { try { StringBuilder send = new StringBuilder(); // lock by send variable lock (send) { // convert base64 string from the client side into byte array byte[] bitmapArrayOfBytes = Convert.FromBase64String(image); // convert the byte array into the bitmap Bitmap bp = (Bitmap)Bitmap.FromStream(new MemoryStream(bitmapArrayOfBytes)); // new bytescout barcode reader sdk object Reader reader = new Reader(); // get the type to find from user's selection in the combobox reader.BarcodeTypesToFind = GetBarcodeTypeToFindFromCombobox(type); // read image to get barcodes reader.ReadFrom(bp); // check if we have got barcodes from the image if (reader.FoundBarcodes != null) { // add each barcode into the string foreach (FoundBarcode barcode in reader.FoundBarcodes) { // add barcodes as text into the output string send.AppendLine(String.Format("{0} : {1}", barcode.Type, barcode.Value)); } } // return the output string return send.ToString(); } // end of lock } catch (Exception ex) { // return the exception instead return (ex.Message + "\r\n" + ex.StackTrace); } } /// <summary> /// Get symbology filter for the SDK from the combobox selection text /// </summary> /// <param name="barType"></param> /// <returns></returns> private static BarcodeTypeSelector GetBarcodeTypeToFindFromCombobox(string barType) { string selectedItemText = barType.Trim().ToUpper(); BarcodeTypeSelector barcodeTypeToScan = new BarcodeTypeSelector(); if (selectedItemText.IndexOf("ALL BARCODES") > -1) barcodeTypeToScan.SetAll(); else if (selectedItemText.IndexOf("ALL LINEAR BARCODES") > -1) barcodeTypeToScan.SetAll1D(); else if (selectedItemText.IndexOf("ALL 2D BARCODES") > -1) barcodeTypeToScan.SetAll2D(); else if (selectedItemText.IndexOf("AZTEC") > -1) barcodeTypeToScan.Aztec = true; else if (selectedItemText.IndexOf("CODABAR") > -1) barcodeTypeToScan.Codabar = true; else if (selectedItemText.IndexOf("CODE 39") > -1) barcodeTypeToScan.Code39 = true; else if (selectedItemText.IndexOf("CODE 128") > -1) barcodeTypeToScan.Code128 = true; else if (selectedItemText.IndexOf("DATAMATRIX") > -1) barcodeTypeToScan.DataMatrix = true; else if (selectedItemText.IndexOf("EAN 13") > -1) barcodeTypeToScan.EAN13 = true; else if (selectedItemText.IndexOf("GS1-128") > -1) barcodeTypeToScan.GS1 = true; else if (selectedItemText.IndexOf("GS1DATABAREXPANDED") > -1) barcodeTypeToScan.GS1DataBarExpanded = true; else if (selectedItemText.IndexOf("GS1DATABAREXPANDEDSTACKED") > -1) barcodeTypeToScan.GS1DataBarExpandedStacked = true; else if (selectedItemText.IndexOf("GS1DATABARLIMITED") > -1) barcodeTypeToScan.GS1DataBarLimited = true; else if (selectedItemText.IndexOf("GS1DATABAROMNIDIRECTIONAL") > -1) barcodeTypeToScan.GS1DataBarOmnidirectional = true; else if (selectedItemText.IndexOf("GS1DATABARSTACKED") > -1) barcodeTypeToScan.GS1DataBarStacked = true; else if (selectedItemText.IndexOf("I2OF5") > -1) barcodeTypeToScan.Interleaved2of5 = true; else if (selectedItemText.IndexOf("PATCH") > -1) barcodeTypeToScan.PatchCode = true; else if (selectedItemText.IndexOf("PDF 417") > -1) barcodeTypeToScan.PDF417 = true; else if (selectedItemText.IndexOf("QR CODE") > -1) barcodeTypeToScan.QRCode = true; else if (selectedItemText.IndexOf("UPCA") > -1) barcodeTypeToScan.UPCA = true; else if (selectedItemText.IndexOf("UPCE") > -1) barcodeTypeToScan.UPCE = true; else if (selectedItemText.IndexOf("MAXICODE") > -1) barcodeTypeToScan.MaxiCode = true; return barcodeTypeToScan; } }
webcam.js
/* JPEGCam v1.0.9 */ /* Webcam library for capturing JPEG images and submitting to a server */ /* Copyright (c) 2008 - 2009 Joseph Huckaby <jhuckaby@goldcartridge.com> */ /* Licensed under the GNU Lesser Public License */ /* http://www.gnu.org/licenses/lgpl.html */ /* Usage: <script language="JavaScript"> document.write( webcam.get_html(320, 240) ); webcam.set_api_url( 'test.php' ); webcam.set_hook( 'onComplete', 'my_callback_function' ); function my_callback_function(response) { alert("Success! PHP returned: " + response); } </script> <a href="javascript:void(webcam.snap())">Take Snapshot</a> */ // Everything is under a 'webcam' Namespace window.webcam = { version: '1.0.9', // globals ie: !!navigator.userAgent.match(/MSIE/), protocol: location.protocol.match(/https/i) ? 'https' : 'http', callback: null, // user callback for completed uploads swf_url: 'webcam.swf', // URI to webcam.swf movie (defaults to cwd) shutter_url: 'shutter.mp3', // URI to shutter.mp3 sound api_url: '', // URL to upload script loaded: false, // true when webcam movie finishes loading quality: 90, // JPEG quality (1 - 100) shutter_sound: true, // shutter sound effect on/off stealth: false, // stealth mode (do not freeze image upon capture) hooks: { onLoad: null, onComplete: null, onError: null }, // callback hook functions set_hook: function(name, callback) { // set callback hook // supported hooks: onLoad, onComplete, onError if (typeof(this.hooks[name]) == 'undefined') return alert("Hook type not supported: " + name); this.hooks[name] = callback; }, fire_hook: function(name, value) { // fire hook callback, passing optional value to it if (this.hooks[name]) { if (typeof(this.hooks[name]) == 'function') { // callback is function reference, call directly this.hooks[name](value); } else if (typeof(this.hooks[name]) == 'array') { // callback is PHP-style object instance method this.hooks[name][0][this.hooks[name][1]](value); } else if (window[this.hooks[name]]) { // callback is global function name window[ this.hooks[name] ](value); } return true; } return false; // no hook defined }, set_api_url: function(url) { // set location of upload API script this.api_url = url; }, set_swf_url: function(url) { // set location of SWF movie (defaults to webcam.swf in cwd) this.swf_url = url; }, get_html: function(width, height, server_width, server_height) { // Return HTML for embedding webcam capture movie // Specify pixel width and height (640x480, 320x240, etc.) // Server width and height are optional, and default to movie width/height if (!server_width) server_width = width; if (!server_height) server_height = height; var html = ''; var flashvars = 'shutter_enabled=' + (this.shutter_sound ? 1 : 0) + '&shutter_url=' + escape(this.shutter_url) + '&width=' + width + '&height=' + height + '&server_width=' + server_width + '&server_height=' + server_height; if (this.ie) { html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="webcam_movie" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swf_url+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/></object>'; } else { html += ''; } this.loaded = false; return html; }, get_movie: function() { // get reference to movie object/embed in DOM if (!this.loaded) return alert("ERROR: Movie is not loaded yet"); var movie = document.getElementById('webcam_movie'); if (!movie) alert("ERROR: Cannot locate movie 'webcam_movie' in DOM"); return movie; }, set_stealth: function(stealth) { // set or disable stealth mode this.stealth = stealth; }, snap: function(url, callback, stealth) { // take snapshot and send to server // specify fully-qualified URL to server API script // and callback function (string or function object) if (callback) this.set_hook('onComplete', callback); if (url) this.set_api_url(url); if (typeof(stealth) != 'undefined') this.set_stealth( stealth ); this.get_movie()._snap( this.api_url, this.quality, this.shutter_sound ? 1 : 0, this.stealth ? 1 : 0 ); }, freeze: function() { // freeze webcam image (capture but do not upload) this.get_movie()._snap('', this.quality, this.shutter_sound ? 1 : 0, 0 ); }, upload: function(url, callback) { // upload image to server after taking snapshot // specify fully-qualified URL to server API script // and callback function (string or function object) if (callback) this.set_hook('onComplete', callback); if (url) this.set_api_url(url); this.get_movie()._upload( this.api_url ); }, reset: function() { // reset movie after taking snapshot this.get_movie()._reset(); }, configure: function(panel) { // open flash configuration panel -- specify tab name: // "camera", "privacy", "default", "localStorage", "microphone", "settingsManager" if (!panel) panel = "camera"; this.get_movie()._configure(panel); }, set_quality: function(new_quality) { // set the JPEG quality (1 - 100) // default is 90 this.quality = new_quality; }, set_shutter_sound: function(enabled, url) { // enable or disable the shutter sound effect // defaults to enabled this.shutter_sound = enabled; this.shutter_url = url ? url : 'shutter.mp3'; }, flash_notify: function(type, msg) { // receive notification from flash about event switch (type) { case 'flashLoadComplete': // movie loaded successfully this.loaded = true; this.fire_hook('onLoad'); break; case 'error': // HTTP POST error most likely if (!this.fire_hook('onError', msg)) { alert("JPEGCam Flash Error: " + msg); } break; case 'success': // upload complete, execute user callback function // and pass raw API script results to function this.fire_hook('onComplete', msg.toString()); break; default: // catch-all, just in case alert("jpegcam flash_notify: " + type + ": " + msg); break; } } };
Web.config
<?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.0"/> <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web> </configuration>
!!!ReadmeFIRST!!!.txt
Readme for live web cam barcode scanning ASP.NET demo Supports all browsers by using 2 modes: (required mode is automatically detected by the javascript) - HTML5 based web camera capture (supported by Google Chrome, Firefox, Safari browsers) - Flash based web camera capture (supported by Internet Explorer 9+ and any browser with flash support) Visual Studio 2008/2010 or higher is required for this sample to run! 1) Install evaluation copy of BarCode Reader SDK from www.bytescout.com 2) in Visual Studio use File - Open - Web-Site.. and open the folder with this sample 3) Add a reference to ByteScout BarCode Reader dll using the menu: Website - Add Reference (find Bytescout Barcode Reader SDK on .NET tab, select and click OK to add a reference) 4) Right-click on "Default.aspx" file and select "Set As Start Page" 5) Run the project in debug mode 6) Visual Studio will run your project in Internet Explorer or another browser If it run Internet Explorer then better copy the link from the IE and copy-and-paste to another browser with HTML5 web cam support like Google Chrome, Firefox or Safari 7) When browser asks for permission to access web-cam click "Allow" to allow access to web cam 8) click "START BARCODE SCAN.." button so the page will start automatically to grab frames from video and sending it to server-side code to read barcodes using Barcode Reader SDK 9) IMPORTANT: barcode should be in focus. Some webcams are not focusing on small barcodes, you may need to adjust the focus on your webcam so it will work OK with small images like barcodes 10) Click Stop to stop barcode scanning Select barcode type to scan if need to scan a particular barcode type (by default scans for all known types)