Пример работы с Web камерой (WIA)

Делаем фото с веб камеры.
Используем стандартную библиотеку Windows Image Acquisition Automation Library. Библиотеку wiaaut.dll качаем (из инета, бесплатно), регистрируем командой regsvr32.

Пример 1: // самый простой (с вызовом диалога) (ПримерWIA.ert)

Device = CreateObject("WIA.CommonDialog");
Image = Device.ShowAcquireImage();
Image.SaveFile(Файл);

Пример 2: // делаем снимок как повезет (ПримерWIA.ert)

Device = CreateObject("WIA.DeviceManager");
Количество = Device.DeviceInfos.Count;
Для ин=1 По Количество Цикл
Если Device.DeviceInfos(ин).Type = 3 Тогда // тип устройства (VideoDeviceType)
dev = Device.DeviceInfos(ин).Connect();
Item = dev.ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}"); // сделать снимок (wiaCommandTakePicture)
Image = Item.Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"); // в формат JPG (wiaFormatJPEG)
Image.SaveFile(Файл);
Прервать;
КонецЕсли;
КонецЦикла;

Пример 3: // выводим на форму изображение с камеры (ActiveX), делаем снимок (ПримерWIA2.ert)

Процедура СделатьФото()
Item = АктивИксWIA.Объект.Device.ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}"); // сделать снимок
Image = Item.Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"); // в формат JPG (wiaFormatJPEG)
Image.SaveFile(Файл);
КонецПроцедуры

Процедура ПослеОткрытия()
АктивИксWIA = СоздатьОбъект("АктивИкс");
АктивИксWIA.УстановитьАтрибут(Форма, "ФАктивИксWIA");
Device = CreateObject("WIA.DeviceManager");
Количество = Device.DeviceInfos.Count;
Для ин=1 По Количество Цикл
Если Device.DeviceInfos(ин).Type = 3 Тогда // тип устройства (VideoDeviceType)
АктивИксWIA.СоздатьЭУ("WIA.VideoPreview");
АктивИксWIA.Объект.Device=Device.DeviceInfos(ин).Connect();
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Вариант ActiveX предпочтительнее тем, что не тратится время на «разогрев» камеры (время на включение, на настройку яркости).


17 Comments

  1. bog2009

    Нормуль, робит

    Reply
  2. bog2009

    Для 8.*

    Device = Новый COMОбъект(«WIA.CommonDialog»);

    Image = Device.ShowAcquireImage();

    Если НЕ Image=Неопределено Тогда

    Image.SaveFile(Файл);

    КонецЕсли;

    Reply
  3. iov

    (0) Иди суды я тя расцалую… прям вот вовремя ты это дело выложил.. я уже думал писать придется 🙂

    Reply
  4. dusha0020

    WIA.CommonDialog у меня не стартует. Точнее где-то стартует, а где-то нет. Сам недавно писал что-то подобное, но когда перенес на теститрование на W7 с XP 1C-ка начала такие ошибки выдавать, что гугл завернулся (и я вместе с ним). Вот эта штука работает везде. Рекомендую.

    Reply
  5. via

    (4) dusha0020, Мне тот вариант как-то не очень понравился (каждый раз настройки выскакивали… иногда v7 выкидывало)… а тут постабильнее получилось (в сети магазинов используется)… из всех вариантов этот самым удачным получился.

    Reply
  6. dusha0020

    (5) Да там есть проблемы с корректной остановкой компоненты, но как-то удалось стабилизировать. Перестал открывать — закрывать камеру для каждой фотки и заработало стабильно. Плюс выбор параметров устройства позволяет на навороченных камерах все-таки подстраивать разрешение и глубину цвета перед началом съемки. На последнем тесте дети 20 минут себя фоткали по всякому и никаких сбоев.

    WIA, однако, пригодилась в другом месте. Так пригодилась, что даже публикацию делаю по мотивам. О подробностях естественно пока умолчу:)

    Reply
  7. mikmike

    (6) dusha0020, не срослось с публикацией?

    Reply
  8. dusha0020
  9. mikmike

    (8) dusha0020, спасибки за оперативность. Ссылка попала в мой архив — мало ли когда пригодиться сможет.

    Reply
  10. dddonnn

    В примере 2 когда сразу веб-камера фотографирует, то чаще всего фотография сохраняется как половинчатая, как будто изображение не успевает сфотографироваться. Скажите, как можно избавиться от этой ошибки?

    Reply
  11. via

    (10) dddonnn, было и у меня такое (на некоторых web-камерах).. мне помогло: пауза после …ExecuteCommand(… Скокато милисекунд (подбирается по ситуации).. После этого есть надежда, что фото готово и можно уже дальше работать (делать …Transfer(… и ….SaveFile(… )

    Reply
  12. dddonnn

    Количество = Device.DeviceInfos.Count; на Win 7 возвращает 0. Подскажите, как бороться с этим траблом?

    Reply
  13. via

    (12) dddonnn, знал бы прикуп, жил бы в Сочи.. Используй http://infostart.ru/public/84693/

    Reply
  14. kitminsk

    Количество = Device.DeviceInfos.Count; на Win 7 возвращает 0. Подскажите, как бороться с этим траблом? Может кто все-таки поборол?

    Reply
  15. kitminsk

    Для первого примера в той же семерке

    {D:DB1C77ВЕБКАМЕРАEXTFORMSПРИМЕР.ERT(73)}: WIA.CommonDialog.1: Не доступно ни одно WIA-устройство выбранного типа.

    Кто-нибудь на 7 винде работал с wia???

    Reply
  16. via

    (15) kitminsk, Верно.. там не робит.. поэтому пришлось другое использовать

    Reply
  17. Andrekaa

    а как сделать чтобы

    Device = Новый COMОбъект(«WIA.CommonDialog»);

    вызова диалога не было?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *