lundi 27 septembre 2010

Scanner une image a partir de Silverlight en utilisant WIA(Windows Image Acquisition)

parmi les nouvelles fonctionnalités de silverlight 4  c'est "trusted applications"  de pouvoir exécuter une application web a l’extérieur du navigateur  et  d'accéder aux ressources materiels et logiciels de la machine de l'utilisateur en local.

Configuration                                                                                                          

Avant de commencer assuré vous que vous disposer de visual studio2010 et la dernier version du SDK de silverlight installer sur votre machine.

créer une nouvelle application silverlight et laisser coché "Héberger l'application Silverlight sur un nouveau site web".

changer les propriétés du projet silverlight pour qu'il puisse être exécuté hors navigateur.

ensuite clicker sur parametres hors navigateur... et cocher


finalement et puisque nous allons utilisé le mot clé dynamic ,vous devez référencé la bibliothèque CSharp.dll disponible dans  le SDK de silverlight4


mise en oeuvre                                                                                                        

dans cette partie nous allons créé une classe nommé ScannerService qui s’en chargera de scanner les images.
concernant les informations fourni par WIA ,je pense qu'il sera très intéressant de créer des énumérations a la place de travailler avec des valeurs numériques.


class ScannerService
{
    // http://msdn.microsoft.com/en-us/library/ms630792(v=VS.85).aspx
    private enum WiaDeviceType
    {
        UnspecifiedDeviceType = 0,
        ScannerDeviceType = 1,
        CameraDeviceType = 2,
        VideoDeviceType = 3
    }

    // http://msdn.microsoft.com/en-us/library/ms630798(v=VS.85).aspx
    private enum WiaImageIntent
    {
        UnspecifiedIntent = 0,
        ColorIntent = 1,
        GrayscaleIntent = 2,
        TextIntent = 4
    }

    // http://msdn.microsoft.com/en-us/library/ms630796(v=VS.85).aspx
    private enum WiaImageBias
    {
        MinimizeSize = 65536,
        MaximizeQuality = 131072
    }

    // http://msdn.microsoft.com/en-us/library/ms630810(v=VS.85).aspx
private class FormatID
    {
     public const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
     public const string wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";
     public const string wiaFormatGIF = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}";
     public const string wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
     public const string wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}";
    }


// les autres méthodes

}



pour pouvoir scanner une image on devra utiliser  WIA.CommonDialog et de spécifier un ensemble de paramètres :


public BitmapSource Scan(String Chemin)
        {
            try
            {    //création d'un objet WIA.CommonDialog
                dynamic wiaDialog = AutomationFactory.CreateObject("WIA.CommonDialog");
                //afficher la boite de dialog qui permet de scanner une image
                dynamic imageFile = wiaDialog.ShowAcquireImage(
                        (int)WiaDeviceType.ScannerDeviceType,
                        (int)WiaImageIntent.TextIntent,
                        (int)WiaImageBias.MaximizeQuality,
                        FormatID.wiaFormatJPEG, true, true, false);
              
                  //forcer le type d'image ,s'il n'est pas jpeg on la convertie
                if (imageFile.FormatID != FormatID.wiaFormatJPEG)
                {
                    dynamic IP = AutomationFactory.CreateObject("Wia.ImageProcess");
                    IP.Filters.Add(IP.FilterInfos("Convert").FilterID);
                    IP.Filters(1).Properties("FormatID").Value = FormatID.wiaFormatJPEG;
                    imageFile = IP.Apply(imageFile);
                }


            //// sauvegarder l'image
            imageFile.SaveFile(chemin);
            }
            catch (COMException  ex)
            {

                if (ex.ErrorCode == -2145320939)
                    {
                        MessageBox.Show("!Scanner");
                    }
              
            }
          
        }

Si on veut manipuler l'image sans la sauvegarder sur disque :il suffit d'ajouter cette fonction et de la mettre a la place de imageFile.SaveFile(chemin);:


   
private BitmapSource ImageFileToBitmap(dynamic imageFile)
        {
            if (imageFile == null)
                return null;
            BitmapImage bitmapBase = new BitmapImage();
            dynamic fileData = imageFile.FileData;
            _imageData = fileData.BinaryData;
            MemoryStream ms = new MemoryStream(_imageData);
            bitmapBase.SetSource(ms);
            WriteableBitmap writeableBitmap = new WriteableBitmap(bitmapBase);
            return writeableBitmap;
        }

1 commentaire: