Сделайте снимок автоматически с помощью веб-камеры в C # с помощью WIA - PullRequest
4 голосов
/ 29 ноября 2010

Я использую WIALib для доступа к своей веб-камере.Код, который я разрабатываю, довольно прост: при нажатии кнопки делается снимок с веб-камеры, а затем отображается в графическом окне.

Я уже могу снимать с помощью своей веб-камеры, но это еще не такполностью автоматизирован.Единственный способ найти фотографии, снятые веб-камерой, заключается в следующем:

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

Но пользователь просит выбрать изображение.И я всегда хочу, чтобы последний снимок был сделан.Итак, я пытаюсь так:

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

wiaItem = wiaRoot.TakePicture(); // take a picture

Cursor.Current = Cursors.WaitCursor; // could take some time

this.Refresh();

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

pictureBox1.Image = Image.FromFile(imageFileName); // create Image instance from file

Marshal.ReleaseComObject(wiaItem);

Но метод TakePicture () возвращает ноль, и поэтому я не могу передать изображение.Самое странное, что картинка действительно была сделана после того, как был вызван метод TakePicture (), так как, если я подхожу к веб-камере вручную, изображение там!Я просто не понимаю, почему он не возвращает значение.

Подводя итог, мне нужно либо одно из двух: 1. Получить TakePicture () для работы, возвращая значение, которое я могу использовать.2. Получите автоматический доступ к списку снимков с веб-камеры, чтобы я мог получить последний сделанный снимок.

С уважением и благодарностью за помощь, Микаэль.

1 Ответ

3 голосов
/ 01 декабря 2010

Из того, что я вижу, wiaItem = wiaRoot.TakePicture() идет по неверному пути.Попробуйте это:

string imageFileName;
wiaRoot.TakePicture( out takenFileName);
pictureBox1.Image = Image.FromFile(imageFileName);

TakePicture сохраняет изображение в файл и возвращает имя нового файла в качестве выходного параметра.

Редактировать за ваш комментарий - вы используете "версию Windows 7" WiaLib?Если это так, попробуйте что-то вроде этого:

var manager = new DeviceManagerClass();
Item wiaItem;
Device device = null;
foreach (var info in manager.DeviceInfos)
{
    if (info.DeviceID == DESIRED_DEVICE_ID)
    {
        device = info.Connect();
        wiaItem = device.ExecuteCommand(CommandID.wiaCommandTakePicture);
    }
}

, где вы используете ExecuteCommand с хорошо известным guid (также предоставляемым из оболочки взаимодействия COM), а не TakePicture.В любом случае это сработало для моей веб-камеры.

...