Utilizando un escáner desde una aplicación Silverlight
Posted on : 03-08-2011 | By : Rodrigo | In : General, Silverlight 4, Silverlight 5
Tags: Confianza Elevada, escaner, Silverlight 4, silverlight 5, WIA
2
Como he mencionado anteriormente aquí y aquí, las aplicaciones de Silverlight pueden ser clientes de automatización, es decir, pueden invocar los servidores de automatización registrados en el sistema operativo Windows de la máquina del usuario.
Un requerimiento bastante común en aplicaciones de negocio es poder utilizar el escáner conectado desde nuestro aplicativo, para poder digitalizar una imagen y posteriormente serializarla a disco y/o presentarla en pantalla, etc.
En sistema operativo Windows contamos con WIA (Windows Image Acquisition), la cual es una plataforma que permite a nuestras aplicaciones interactuar con hardware de imágenes y también estandariza la interacción entre las aplicaciones y los escáneres, es decir, es un común denominador entre el manufacturero del dispositivo y tú como desarrollador. WIA está presente en Windows desde Windows ME en adelante, y su versión más reciente es la 2.0.
Es importante notar que tu hardware debe ser compatible con WIA para que el código de ejemplo de este artículo funcione. Revisa la documentación de tu escáner para conocer si existe compatibilidad.
WIA.CommonDialog
El objeto WIA.CommonDialog tiene diferentes métodos que nos ayudan a desplegar las cajas de diálogo para poder seleccionar un dispositivo de imagen, como una cámara o un escáner, y además para escanear una imagen. Si creamos una referencia a este objeto por medio de la clase AutomationFactory, podemos fácilmente integrar capacidades de escaneo en nuestra aplicación de Silverlight.
El objeto WIA.CommonDialog tiene algunos métodos bastantes interesantes, los cuales se destacan en la siguiente tabla:
| ShowSelectDevice | Muestra una caja de diálogo para seleccionar el dispositivo que deseamos utilizar, por ejemplo una cámara o un escáner. |
| ShowDeviceProperties | Muestra las propiedades del dispositivo seleccionado en el método ShowSelectDevice |
| ShowAcquireImage | Abre una caja de diálogo para escanear una imagen, usando el dispositivo configurado por default |
Por ejemplo, al ejecutar ShowSelectDevice(), se desplegará la siguiente caja de dialogo:
Nota cómo también se muestran las cámaras conectadas en el equipo.
Para nuestro código utilizaremos el método ShowAcquireImage(). Este método regresa un objeto de tipo WIA.ImageFile, que representa la imagen digitalizada.
El siguiente fragmento de código muestra el uso de este método para desplegar la caja de diálogo para escanear.
using (dynamic commonDialog = AutomationFactory.CreateObject("WIA.CommonDialog")) { dynamic imageFile; try { imageFile = commonDialog.ShowAcquireImage(); } catch (Exception originalException) { throw new Exception("El scanner no está listo", originalException); }
La siguiente ilustración muestra la caja de diálogo después de haber seleccionado la vista previa de la imagen a escanear (en mi caso, la portada de un disco bastante bueno que les recomiendo ampliamente
)
Al hacer clic en el botón “Scan”, la imagen será digitalizada.
En este caso, estamos obteniendo la imagen escaneada y la guardamos en la variable llamada imageFile. No obstante, en este momento la imagen aún no ha sido convertida a algún formato válido. Para ello podemos utilizar otro objeto: WIA.ImageProcess.
WIA.ImageProcess
El objeto WIA.ImageProcess permite manejar la lista de filtros que deseamos aplicar para una imagen. Un filtro en el contexto del objeto WIA.ImageProcess es una modificación a un objeto de tipo ImageFile.
En nuestro ejemplo, estamos creando una referencia al objeto WIA.ImageProcess, la cual guardaremos en una variable llamada imageProcess. Posteriormente, agregamos a la colección de filtros el filtro Convert, el cual nos servirá para convertir el formato de la imagen escaneada a un formato conocido, en este caso JPEG.
El formato JPEG en WIA está representado por el GUID {B96B3CAE-0728-11D3-9D7B-0000F81EF32E}, por lo que es buena idea tenerlo en una variable: la variable wiaFormatJPEG. Esto se lo indicamos a la propiedad FormatID del filtro Convert y finalmente aplicamos el filtro por medio de la ejecución del método Apply(), pasando como parámetro la imagen original.
using (dynamic imageProcess = AutomationFactory.CreateObject("WIA.ImageProcess")) { imageProcess.Filters.Add(imageProcess.FilterInfos("Convert").FilterID); imageProcess.Filters[1].Properties("FormatID").Value = wiaFormatJPEG;
//wiaFormatJPEG es una cadena con el GUID descrito
try
{
dynamic newImageFile = imageProcess.Apply(imageFile);
//guardar a disco u obtener el Stream
}
}
Ya con la nueva imagen convertida al formato JPEG podríamos obtener el Stream para poder usarlo en un BitmapImage, tal y como lo muestra la siguiente ilustración.
O si quisiéramos guardar la imagen a disco, sería muy sencillo hacer a través del método SaveFile().
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); string fullFileName = string.Format(@"{0}\{1}", path, fileName);
//fileName es el nombre del archivo
if (File.Exists(fullFileName))
File.Delete(fullFileName);
newImageFile.SaveFile(fullFileName);
En este caso, se guardará la imagen escaneada, en formato JPEG, en la carpeta “My Pictures” de la máquina del usuario.






