Захват камеры с помощью WIA, C # и Win 7

#c# #wia

#c# #wia

Вопрос:

Я пытаюсь сделать снимок с веб-камеры с помощью WIA 2.0, C #, .net 4.0 в Windows 7. Я перепробовал много разных образцов, но ничего не работает. Я всегда получаю это исключение: «COMException было необработанным» Исключением из HRESULT: 0x80210015 «. Код является WIA_S_NO_DEVICE_AVAILABLE . Я проверил, запущена ли WIA-Service и отображается ли cam в сканерах и камере. Я понятия не имею, что здесь не так! Кто-нибудь может помочь?

В этой строке возникает исключение:

Устройство d = class1.Показывает выбранное устройство (тип WiaDeviceType.CameraDeviceType, true, false);:

Вот код

 string DeviceID;

    const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
    const string wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";
    const string wiaFormatGIF = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}";
    const string wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
    const string wiaFormatTIFF = "{B96B3CB1-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;
    }

    class WIA_ERRORS
    {
        public const uint BASE_VAL_WIA_ERROR = 0x80210000;
        public const uint WIA_ERROR_PAPER_EMPTY = BASE_VAL_WIA_ERROR   3;
    }


    public void ADFScan()
    {

        //Choose Scanner
        CommonDialogClass class1 = new CommonDialogClass();
        Device d = class1.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false);
        if (d != null)
        {
            this.DeviceID = d.DeviceID;
        }
        else
        {
            //no scanner chosen
            return;
        }



        WIA.CommonDialog WiaCommonDialog = new CommonDialogClass();

        bool hasMorePages = true;
        int x = 0;
        int numPages = 0;
        while (hasMorePages)
        {
            //Create DeviceManager
            DeviceManager manager = new DeviceManagerClass();
            Device WiaDev = null;
            foreach (DeviceInfo info in manager.DeviceInfos)
            {
                if (info.DeviceID == this.DeviceID)
                {
                    WIA.Properties infoprop = null;
                    infoprop = info.Properties;

                    //connect to scanner
                    WiaDev = info.Connect();


                    break;
                }
            }



            //Start Scan

            WIA.ImageFile img = null;
            WIA.Item Item = WiaDev.Items[1] as WIA.Item;

            try
            {

                img = (ImageFile)WiaCommonDialog.ShowTransfer(Item, wiaFormatJPEG, false);


                //process image:
                //one would do image processing here
                //

                //Save to file
                string varImageFileName = "c:\test"   x.ToString()   ".jpg";
                if (File.Exists(varImageFileName))
                {
                    //file exists, delete it
                    File.Delete(varImageFileName);
                }
                img.SaveFile(varImageFileName);
                numPages  ;
                img = null;

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: "   ex.Message);
            }
            finally
            {
                Item = null;
                //determine if there are any more pages waiting
                Property documentHandlingSelect = null;
                Property documentHandlingStatus = null;
                foreach (Property prop in WiaDev.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;


                }

                hasMorePages = false; //assume there are no more pages
                if (documentHandlingSelect != null)
                //may not exist on flatbed scanner but required for feeder
                {
                    //check for document feeder
                    if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) amp; WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0)
                    {
                        hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) amp; WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0);
                    }
                }
                x  ;
            }
        }

    }
  

Спасибо за любую помощь!

Комментарии:

1. Устройство, которое отображается в разделе сканеры и камеры, не обязательно является камерой. Ваш код запрашивает только камеры. Ошибка, которую вы получаете, заключается в том, что у вас нет устройств этого типа.

Ответ №1:

Это типичный пример недокументированной ошибки от Microsoft… Код ошибки просто означает, что устройство не найдено, либо не подключено, либо не распознано WIA.

Ответ №2:

Попробуйте добавить метод, подобный CameraTest, для проверки, подключена ли камера:

 bool CameraTest()
{
bool present = false;

try
{
    Device d = class1.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false);
    present = true;
}
catch (Exception ex)
{}

return present;
}
  

Ответ №3:

Попробуйте приведенный ниже код:

 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; WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0)
                    {
                        hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) 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;
    }

}
  

Комментарии:

1. почему я отказался от голосования? … объясните мне, что не так с этим ответом?

2. Что значит «попробовать это»? Это ответ? Как это помогает? Ваш ShowSelectDevice точно такой же, как в вопросе. Это неверный ответ, он не объясняет проблему, он не предлагает обходной путь. Это всего лишь фрагмент кода, с которым стоит рискнуть.