web-dev-qa-db-fra.com

Utiliser un scanner sans dialogues en C #

Je construis une application .Net 4.0 pour le contrôle à distance d'un scanner. J'ai essayé les bibliothèques TWAIN et WIA, mais j'ai le même problème. Numérisation d'images sans sélection du scanner et boîtes de dialogue des paramètres de numérisation

J'ai trouvé un article utile sur les scripts WIA dans .Net , et je l'ai modifié comme suit:

private Image Scan(string deviceName)
{
    WiaClass wiaManager = null;       // WIA manager COM object
    CollectionClass wiaDevs = null;   // WIA devices collection COM object
    ItemClass wiaRoot = null;         // WIA root device COM object
    CollectionClass wiaPics = null;   // WIA collection COM object
    ItemClass wiaItem = null;         // WIA image COM object

    try
    {
        // create COM instance of WIA manager
        wiaManager = new WiaClass();

        // call Wia.Devices to get all devices
        wiaDevs = wiaManager.Devices as CollectionClass;
        if ((wiaDevs == null) || (wiaDevs.Count == 0))
        {
            throw new Exception("No WIA devices found!");
        }

        object device = null;
        foreach (IWiaDeviceInfo currentDevice in wiaManager.Devices)
        {
            if (currentDevice.Name == deviceName)
            {
                device = currentDevice;
                break;
            }
        }

        if (device == null)
        {
            throw new Exception
            (
                "Device with name \"" + 
                deviceName + 
                "\" could not be found."
            );
        }

        // select device
        wiaRoot = (ItemClass)wiaManager.Create(ref device); 

        // something went wrong
        if (wiaRoot == null)
        {
            throw new Exception
            (
                "Could not initialize device \"" + 
                deviceName + "\"."
            );
        }

        wiaPics = wiaRoot.GetItemsFromUI
        (
            WiaFlag.SingleImage,
            WiaIntent.ImageTypeColor
        ) as CollectionClass;

        if (wiaPics == null || wiaPics.Count == 0)
        {
            throw new Exception("Could not scan image.");
        }

        Image image = null;

        // enumerate all the pictures the user selected
        foreach (object wiaObj in wiaPics)
        {
            if (image == null)
            {
                wiaItem = (ItemClass)Marshal.CreateWrapperOfType
                (
                    wiaObj, typeof(ItemClass)
                );

                // create temporary file for image
                string tempFile = Path.GetTempFileName();

                // transfer picture to our temporary file
                wiaItem.Transfer(tempFile, false);

                // create Image instance from file
                image = Image.FromFile(tempFile);
            }

            // release enumerated COM object
            Marshal.ReleaseComObject(wiaObj);
        }

        if (image == null)
        {
            throw new Exception("Error reading scanned image.");
        }

        return image;
    }
    finally
    {
        // release WIA image COM object
        if (wiaItem != null)
            Marshal.ReleaseComObject(wiaItem);

        // release WIA collection COM object
        if (wiaPics != null)
            Marshal.ReleaseComObject(wiaPics);

        // release WIA root device COM object
        if (wiaRoot != null)
            Marshal.ReleaseComObject(wiaRoot);

        // release WIA devices collection COM object
        if (wiaDevs != null)
            Marshal.ReleaseComObject(wiaDevs);

        // release WIA manager COM object
        if (wiaManager != null)
            Marshal.ReleaseComObject(wiaManager);
    }
}

Avec cela, j’ai réussi à sélectionner le périphérique à partir de la configuration (paramètre d’entrée de la méthode de numérisation) et à récupérer l’image obtenue après la numérisation. 

Mais le problème avec la boîte de dialogue des options d’analyse (Numériser avec DEVICENAME). S'agissant d'une application de contrôle à distance, la boîte de dialogue ne sera pas visible par l'utilisateur. Je dois donc l'ignorer à l'aide des paramètres par défaut ou utiliser les paramètres d'une configuration si nécessaire.

Boîte de dialogue des options d'analyse: scanning options dialog

14
Miljenko Barbir

Tout d’abord, merci beaucoup à Miljenko Barbir pour la solution ci-dessus, cela fonctionne très bien.

Je voudrais ajouter que si vous voulez zéro dialogue, vous pouvez utiliser (à partir du code de démonstration de Milijenko)

WIA.ImageFile image = item.Transfer(wiaFormatBMP);

au lieu de 

WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);

En gros, cela supprime également la barre de progression, ce qui vous permet de numériser sans aucune boîte de dialogue.

6
Greg Netland
// show scanner view 
guif.ShowUI = 0;
guif.ModalUI = 0;

Vous pouvez voir dans ce code que j'ai implémenté.

0
user2450942