[Windows Phone] Leer códigos de barras

Introducción

Un código de barras es una forma de representar
graficamente un conjunto de información de modo que pueda ser facilmente
leida por una máquina.

En nuestro día a día estamos acostumbrados
a ver códigos de barras por todos lados, en el último libro que leiste,
en ese CD de música que te asombro e incluso en el cartón de leche de
tu desayuno. En distintos formatos y tipos pero sin duda, son un factor
importante. El formato más comun es un conjunto de barras verticales
paralelas entre si utilizadas para identificar un producto en concreto. A
este conjunto de códigos de barras con líneas verticales se les conoce
como 1D (1 Dimensión). Tambien tenemos otro conjunto de códigos basados
en patrones geométricos diseñados para almacenar más información. Son
los conocidos como 2D (2 Dimensiones) donde el representante más
conocido es el código QR.

En este artículo vamos a aprender como generar códigos QR desde nuestra aplicación Windows Phone. ¿Te apuntas?

Windows Phone y los códigos de barras

Desde
Windows Phone 7 se pueden leer un conjunto de los códigos de barras más
importantes como EAN-13 o los códigos QR directamente con la aplicación
de búsqueda Bing Vision sin la necesidad de instalar ningun App para
ello.

ZXing.Net

Para generar códigos de barras desde nuestra aplicación Windows Phone utilizaremos la librería ZXing.Net. Esta librería es un port de la librería open spurce ZXing.

Escaneando códigos de barras

Como
solemos hacer, vamos a crear una Aplicación de ejemplo para aprender
como generar códigos de barras utilizando la librería ZXing.Net desde
Windows Phone:

Creamos un proyecto desde la plantilla más básica para concentrar
nuestra atención en la librería ZXing.NET que nos ocupa en esta entrada.

Lo
primero que debemos hacer para poder trabajar con la librería es…
obtener la librería. Para ello, en el Explorador de soluciones, hacemos
clic derecho sobre las referencias del proyecto y elegimos la opción
Manage NuGet Packages…

En la ventana que nos aparece buscaremos por la palabra «ZXing» e instalamos la opción  llamada «ZXing.Net» de las disponibles:

NOTA: También podemos instalar la librería con el Package Manager Console ejecutando el siguiente comando: Install-Package ZXing.Net

Todo listo. Comenzamos!

Los primero que necesitaremos para escanear el código de barras será… la cámara!. En Windows Phone contamos con la clase PhotoCamera
que nos da acceso a las funcionalidades de la cámara del dispositivo
incluidas opciones de flash, focus, opciones de resolución, etc. Creamos
en el constructor de la aplicación una instancia de PhotoCamera:

_phoneCamera = new PhotoCamera();

Nos suscribimos a su evento Initialized, lanzado con la inicialización de la cámara:

_phoneCamera.Initialized += cam_Initialized;

En la inicialización de la cámara haremos lo siguiente:

if (e.Succeeded)
{
Dispatcher.BeginInvoke(delegate
{
_phoneCamera.FlashMode = FlashMode.Off;
_previewBuffer = new WriteableBitmap((int)_phoneCamera.PreviewResolution.Width,
(int)_phoneCamera.PreviewResolution.Height);

_barcodeReader = new BarcodeReader { Options = { TryHarder = true } };

_barcodeReader.ResultFound += _bcReader_ResultFound;
_scanTimer.Start();
});
}

Analicemos el código anterior antes de continuar. Establecemos varias
propiedades básicas del objeto de tipo PhoneCamera como el flash por
ejemplo. Inicializamos el objeto de tipo BarCodeReader encargado
de decodificar el código capturado por la cámara. Nos suscribimos al
evento ResultFound del BarCodeReader que se lanzará cuando un código es
capturado. Por último lanzamos el Timer que inicializamos en el
constructor. Este Timer se encargará de escanear códigos de barras
constantemente. Veamos su inicialización:

 _scanTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) };
_scanTimer.Tick += (o, arg) => ScanForBarcode();

Como podemos ver en el código anterior cada 100 milisegundos se lanzará el método ScanForCode. El método llamado ScanForBarCode que obtendrá el resultado capturado por la cámara y se lo pasará al BarCodeReader utilizando su método Decode.
El método Decode es capaz de decodificar los siguientes formatos:
UPC-A, UPC-E, EAN-8, EAN-13, Code 39, Code 93, Code 128, ITF, Codabar,
MSI, RSS-14 (all variants), QR Code, Data Matrix, Aztec y PDF-417.

private void ScanForBarcode()
{
_phoneCamera.GetPreviewBufferArgb32(_previewBuffer.Pixels);
_previewBuffer.Invalidate();
_barcodeReader.Decode(_previewBuffer);
}

Nos suscribimos al evento ResultFound de modo que cuando se encuentre un
código de barras de cualquiera de los formatos soportados:

private void _bcReader_ResultFound(Result obj)
{
if (obj.Text.Equals(_barCode)) return;
VibrateController.Default.Start(TimeSpan.FromMilliseconds(100));
MessageBox.Show(string.Format("Código capturado!. Formato: {0}, Contenido: {1}", obj.BarcodeFormat, obj.Text));
_barCode = obj.Text;
}

Se producirá una pequeña vibración notificando al usuario junto a un
mensaje indicando el formato y el contenido del código de barras.

Podéis descargar el ejemplo a continuación:

Más información

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *