Windows Image Acquisition (WIA) a été introduit avec Windows 2000. Cette plateforme à pour but de permettre l’accès aux périphériques de type scanner et webcam sans avoir à se soucier des détails d’interfaçage avec ceux-ci. De plus WIA inclus des interfaces graphiques nous aider à utiliser ces périphériques depuis notre code (script, COM, .NET via COM). Voici un schéma montrant l’architecture de WIA :
Pour utiliser WIA depuis notre code C# il faut ajouter la référence COM Microsoft Windows Image Acquisition Library v2.0 :
Et ajouter le using correspondant :
using WIA;
Pour commencer à scanner un document, on utilise la class CommonDialog. Cette classe permet d’afficher les différents écrans fourni par WIA. Pour scanner un document on utilise sa méthode ShowAcquireImage :
var dlg = new WIA.CommonDialog();
ImageFile image = dlg.ShowAcquireImage(
DeviceType: WiaDeviceType.ScannerDeviceType,
Intent: WiaImageIntent.ColorIntent,
Bias: WiaImageBias.MinimizeSize,
FormatID: ImageFormat.Jpeg.Guid.ToString("B"),
AlwaysSelectDevice: true,
UseCommonUI: true,
CancelError: false);
Voici la description des arguments :
- ScannerDeviceType : Type de device souhaité (scanner, appareil photo, webcam)
- Intent : Profile du scanner (couleur, noir et blanc ou texte)
- Bias : Qualité
- Format : Format de l’image souhaité
- AlwaysSelectDevice : Affiche ou non la fenêtre de sélection du périphérique
- UseCommonUI : affiche ou non l’UI
- CancelError : lève ou non une exception lorsque l’utilisateur annule le scan
Cette méthode affiche les écrans suivants :
La méthode ShowAcquireImage nous renvoie un objet de type ImageFile. Cet objet permet de manipuler le résultat du scan. On peut par exemple directement sauvegarder l’image dans un fichier :
string path = @"demo.jpg";
if (image != null)
{
image.SaveFile(path);
}
Mais souvent le résultat de la numérisation est lourd (plusieurs MO), il est donc utile d’appliquer une petite compression avant de sauvegarder le fichier. Pour cela on commence par récupérer le contenu de l’image scannée sous la forme d’un tableau de bytes puis on utilise les Encoder du framework .NET pour compresser l’image :
Vector vector = image.FileData;
if (vector != null)
{
byte[] bytes = vector.get_BinaryData() as byte[];
if (bytes != null)
{
using (var ms = new MemoryStream(bytes))
{
using (Bitmap bitmap = new Bitmap(ms))
{
ImageCodecInfo codecInfo = ImageCodecInfo.GetImageDecoders().First(codec => codec.FormatID == ImageFormat.Jpeg.Guid);
Encoder encoder = Encoder.Quality;
EncoderParameters parameters = new EncoderParameters(1);
EncoderParameter qualityParameter = new EncoderParameter(encoder, 80L); // qualité 80%
parameters.Param[0] = qualityParameter;
bitmap.Save(path, codecInfo, parameters);
}
}
}
}
Et voilà, en quelques lignes de code et à l’aide de Windows Image Acquisition, on peut proposer une interface graphique à l’utilisateur pour numériser un document et ce quelque soit son scanner.