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)