WP7. Utilizando la cámara.

Ahora que ya tenemos Windows Phone 7.5 (Mango) y con el SDK 7.1, se nos abren más posibilidades de desarrollo de aplicaciones. Aprovechamos estas nuevas funcionalidades para actualizar la aplicación mUbiquo y ofrecer la posibilidad de guardar el contacto en el People Hub y, tarea que intentaré explicar en este post, mejorar la captura del código utilizando el nuevo API para la Cámara, PhotoCamera. Este API nos permite controlar la cámara del dispositivo y sus funciones como enfoque, captura de imagen, etc.

Conociendo estas capacidades, la idea es eliminar la necesidad de utilizar la tarea de obtener una foto por un formulario que escanee automáticamente el código, usando este API.

Lo primero es lo primero y tenemos que crearnos un formulario, que contenga un control, por ejemplo Rectangle, al que le podamos aplicar un relleno de tipo Video.

<Rectangle x:Name="_previewRect" Margin="0" Height="800" Width="600" HorizontalAlignment="Center" VerticalAlignment="Center">

    <Rectangle.Fill>

        <VideoBrush x:Name="_previewVideo">

            <VideoBrush.RelativeTransform>

                <CompositeTransform x:Name="_previewTransform" CenterX=".5" CenterY=".5" />

            </VideoBrush.RelativeTransform>

        </VideoBrush>

    </Rectangle.Fill>

</Rectangle>

Vamos a necesitar inicializar la cámara y establecer el origen del VideoBrush con este para que se previsualice el video, esto lo podemos hacer en el evento OnNavigatedTo de la página XAML.

photoCamera = new PhotoCamera();

photoCamera.Initialized += OnPhotoCameraInitialized;

_previewVideo.SetSource(photoCamera);

Ahora que tenemos enlazada la cámara, vamos a necesitar un temporizador, que cada cierta frecuencia procese la imagen y muestre la información, en el caso de que tenga un código reconocible.

public CameraPage()

{

    InitializeComponent();

 

    timer = new DispatcherTimer {Interval = TimeSpan.FromMilliseconds(250)};

    timer.Tick += (o, arg) => ScanPreviewBuffer();

}

Aprovechamos que la cámara se tiene que inicializar, para arrancar el temporizador.

private void OnPhotoCameraInitialized(object sender, CameraOperationCompletedEventArgs e)

{

    //Esto es para el lector de código QR

    int width = Convert.ToInt32(photoCamera.PreviewResolution.Width);

    int height = Convert.ToInt32(photoCamera.PreviewResolution.Height);

    luminance = new PhotoCameraLuminanceSource(width, height);

    reader = new QRCodeReader();

 

    //Aquí iniciamos el temporizador

    Dispatcher.BeginInvoke(() =>

    {

        _previewTransform.Rotation = photoCamera.Orientation;

        timer.Start();

    });

}

Sólo nos queda procesar la imagen cada vez que se ejecuta el temporizador.

private void ScanPreviewBuffer()

{

    // Obtenemos el buffer de la imagen de la cámara

    photoCamera.GetPreviewBufferY(luminance.PreviewBufferY);

    

    // La transformamos en un Bitmap para procesar el código QR

    var binarizer = new HybridBinarizer(luminance);

    var binBitmap = new BinaryBitmap(binarizer);

    var resultText = reader.decode(binBitmap);

    Dispatcher.BeginInvoke(() => BarcodeResults(resultText.Text));

}

El resto del código se encargaría de mostrar la información escaneada y de las acciones predefinidas para cada tipo de código.

Windows Phone 7 es una plataforma que va creciendo y ahora con el SDK 7.1 hemos dado un gran paso que nos permitirá desarrollar grandes aplicaciones.

 

Saludos a todos…

Un pensamiento en “WP7. Utilizando la cámara.”

Deja un comentario

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