Using a scanner without dialogs in C#

前端 未结 3 912
失恋的感觉
失恋的感觉 2020-12-28 18:47

I\'m building a .Net 4.0 application for remote control of a scanner device. I have tried both TWAIN and WIA libraries, but I have the same problem. Scanning images

相关标签:
3条回答
  • 2020-12-28 19:02

    First off, many thanks to Miljenko Barbir for his above solution, it works great.

    I would like to add that if you want zero dialogs, you can use (from Milijenko's demo code)

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

    instead of

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

    This basically removes the progress bar as well, so you get scanning without any dialogs.

    0 讨论(0)
  • 2020-12-28 19:04

    In the end I did not use the code written in the question for scanning dialogs. I found a useful example of Scanning with Windows Image Acquisition 2.0 which by the way also had a blocking dialog, but this was easily modified and in moments I had a simple class with a Scan(string scannerId) function which would just scan with a selected device and nothing more, see code () below:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Drawing;
    
    namespace WIATest
    {
        class WIAScanner
        {
            const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
    
            class WIA_DPS_DOCUMENT_HANDLING_SELECT
            {
                public const uint FEEDER = 0x00000001;
                public const uint FLATBED = 0x00000002;
            }
    
            class WIA_DPS_DOCUMENT_HANDLING_STATUS
            {
                public const uint FEED_READY = 0x00000001;
            }
    
            class WIA_PROPERTIES
            {
                public const uint WIA_RESERVED_FOR_NEW_PROPS = 1024;
                public const uint WIA_DIP_FIRST = 2;
                public const uint WIA_DPA_FIRST = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
                public const uint WIA_DPC_FIRST = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
                //
                // Scanner only device properties (DPS)
                //
                public const uint WIA_DPS_FIRST = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
                public const uint WIA_DPS_DOCUMENT_HANDLING_STATUS = WIA_DPS_FIRST + 13;
                public const uint WIA_DPS_DOCUMENT_HANDLING_SELECT = WIA_DPS_FIRST + 14;
            }
    
            /// <summary>
            /// Use scanner to scan an image (with user selecting the scanner from a dialog).
            /// </summary>
            /// <returns>Scanned images.</returns>
            public static List<Image> Scan()
            {
                WIA.ICommonDialog dialog = new WIA.CommonDialog();
                WIA.Device device = dialog.ShowSelectDevice(WIA.WiaDeviceType.UnspecifiedDeviceType, true, false);
    
                if (device != null)
                {
                    return Scan(device.DeviceID);
                }
                else
                {
                    throw new Exception("You must select a device for scanning.");
                }
            }
    
            /// <summary>
            /// Use scanner to scan an image (scanner is selected by its unique id).
            /// </summary>
            /// <param name="scannerName"></param>
            /// <returns>Scanned images.</returns>
            public static List<Image> Scan(string scannerId)
            {
                List<Image> images = new List<Image>();
    
                bool hasMorePages = true;
                while (hasMorePages)
                {
                    // select the correct scanner using the provided scannerId parameter
                    WIA.DeviceManager manager = new WIA.DeviceManager();
                    WIA.Device device = null;
    
                    foreach (WIA.DeviceInfo info in manager.DeviceInfos)
                    {
                        if (info.DeviceID == scannerId)
                        {
                            // connect to scanner
                            device = info.Connect();
                            break;
                        }
                    }
    
                    // device was not found
                    if (device == null)
                    {
                        // enumerate available devices
                        string availableDevices = "";
                        foreach (WIA.DeviceInfo info in manager.DeviceInfos)
                        {
                            availableDevices += info.DeviceID + "n";
                        }
    
                        // show error with available devices
                        throw new Exception("The device with provided ID could not be found. Available Devices:n" + availableDevices);
                    }
    
                    WIA.Item item = device.Items[1] as WIA.Item;
    
                    try
                    {
                        // scan image
                        WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
                        WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);
    
                        // save to temp file
                        string fileName = Path.GetTempFileName();
                        File.Delete(fileName);
                        image.SaveFile(fileName);
                        image = null;
    
                        // add file to output list
                        images.Add(Image.FromFile(fileName));
                    }
                    catch (Exception exc)
                    {
                        throw exc;
                    }
                    finally
                    {
                        item = null;
    
                        //determine if there are any more pages waiting
                        WIA.Property documentHandlingSelect = null;
                        WIA.Property documentHandlingStatus = null;
    
                        foreach (WIA.Property prop in device.Properties)
                        {
                            if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT)
                                documentHandlingSelect = prop;
    
                            if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS)
                                documentHandlingStatus = prop;
                        }
    
                        // assume there are no more pages
                        hasMorePages = false;
    
                        // may not exist on flatbed scanner but required for feeder
                        if (documentHandlingSelect != null)
                        {
                            // check for document feeder
                            if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) &amp;amp;amp;amp; WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0)
                            {
                                hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) &amp;amp;amp;amp; WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0);
                            }
                        }
                    }
                }
    
                return images;
            }
    
            /// <summary>
            /// Gets the list of available WIA devices.
            /// </summary>
            /// <returns></returns>
            public static List<string> GetDevices()
            {
                List<string> devices = new List<string>();
                WIA.DeviceManager manager = new WIA.DeviceManager();
    
                foreach (WIA.DeviceInfo info in manager.DeviceInfos)
                {
                    devices.Add(info.DeviceID);
                }
    
                return devices;
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-28 19:05
    // show scanner view 
    guif.ShowUI = 0;
    guif.ModalUI = 0;
    

    You can see in this code that's I've implemented.

    0 讨论(0)
提交回复
热议问题