В платформе 8.3.14 движок поля HTML документа был заменён с MS IE на WebKit. Это привело к отвалу ряда подобных решений, основанных на технологии ActiveX.
Из аналогов можно упомянуть публикацию Native ВК для работы с веб камерой, основанную на самом старом из распространённых API - Video for Windows.
Технические детали
Написано на MS Visual C++ 2017.
Используемые API: Microsoft Media Foundation и GDI+.
Скомпилировано для Windows, x86 и x64. Работает в Windows 7 и выше.
Протестировано на платформе 1С версии 8.3.16, 8.3.17, 8.3.18.
Методы компоненты
- ПолучитьКоличествоУстройств (GetDevicesCount): возвращает число - количество устройств захвата видео в системе. Без параметров.
- ПолучитьИмяУстройства (GetDeviceName): возвращает строку - имя устройства. Один параметр - номер устройства. Нумерация с нуля. Значение по умолчанию - ноль.
- ПолучитьКартинку (GetPicture): получает с камеры один кадр. Возвращает двоичные данные - фото в требуемом формате. Четыре параметра:
- номер устройства. Нумерация с нуля. Значение по умолчанию = ноль.
- формат данных. Допустимые значения:
- 0 - bmp. Значение по-умолчанию. 24-битный цвет (RGB24).
- 1 - gif
- 2 - jpeg
- 3 - png
- 4 - tiff
- качество (степень сжатия). Используется только для формата jpeg. Допустимые значения - от 0 до 100. Значение по умолчанию = 75.
- код разрешения (media type index). Используется для установки разрешения кадра. Допустимые значения - Неопределено или число. Нумерация с нуля. Значение по умолчанию = Неопределено, что соответствует коду разрешения, установленному в драйвере камеры по умолчанию.
- ВыбратьРазрешения (SelectMediaTypes): инициализирует выборку доступных разрешений камеры. Один параметр - номер устройства. Нумерация с нуля. Значение по умолчанию - ноль. Возвращаемого значения нет.
- ПолучитьСледующееРазрешение (GetNextMediaType): получает следующее доступное разрешение камеры. Работает быстрее и правильнее (с точки зрения API), чем устаревший метод ПолучитьРазрешение. Возвращает булево. Истина = разрешение получено, Ложь = выборка завершена. Три выходных параметра возвращают число:
- код разрешения.
- ширина кадра.
- высота кадра.
- ПолучитьКоличествоРазрешений (GetMediaTypesCount): устарел, оставлен для совместимости. Возвращает число - количество типов среды (media type), поддерживаемых драйвером. В общем случае их больше, чем количество именно разрешений. Один параметр - номер устройства. Нумерация с нуля. Значение по-умолчанию - ноль.
- ПолучитьРазрешение (GetMediaType): устарел, оставлен для совместимости. Позволяет получить разрешение, соответствующее переданному коду. Возвращает число - следующий код с уникальным разрешением или Неопределено, если разрешения кончились. Четыре параметра:
- номер устройства. Нумерация с нуля. Значение по умолчанию - ноль.
- код разрешения. Значение по умолчанию - Неопределено. Если параметр не передан, метод получает разрешение камеры по умолчанию и возвращает Неопределено.
- ширина кадра. Выходной параметр.
- высота кадра. Выходной параметр.
В асинхронном режиме, соответственно, нужно вызывать методы НачатьВызов<ИмяМетода>() с передачей описания оповещения в первом параметре. Обработчики оповещения получают три параметра: Результат, ПараметрыВызова, ДополнительныеПараметры.
Пример подключения
&НаКлиенте
Асинх
Процедура ПриОткрытии(Отказ)
Подключено = Ждать ПодключитьКомпонентуWebCam();
Если Подключено Тогда
ОбъектКомпоненты = Новый("AddIn.WebCam.WMFPictures");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Асинх
Функция ПодключитьКомпонентуWebCam(Знач ЭтоУстановка = Ложь)
Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх("ОбщийМакет.WebCam", "WebCam", ТипВнешнейКомпоненты.Native);
Если Не Подключено Тогда
Если ЭтоУстановка Тогда
ПредупреждениеАсинх("Ошибка установки внешней компоненты.");
Иначе
РезультатВопроса = Ждать ВопросАсинх(
"Для возможности захвата изображений требуется установить внешнюю компоненту.
|Выполнить установку?",
РежимДиалогаВопрос.ДаНет);
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
Ждать УстановитьВнешнююКомпонентуАсинх("ОбщийМакет.WebCam");
Подключено = Ждать ПодключитьКомпонентуWebCam(Истина);
Иначе
ПредупреждениеАсинх("Ошибка установки внешней компоненты.");
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Подключено;
КонецФункции
Пример получения списка разрешений
&НаКлиенте
Асинх
Процедура ОбновитьСписокРазрешений();
Элементы.Разрешение.СписокВыбора.Очистить();
Ждать ОбъектКомпоненты.ВыбратьРазрешенияАсинх(ТекущаяКамера);
РезультатАсинхВызоваВнешнейКомпоненты = Ждать ОбъектКомпоненты.ПолучитьСледующееРазрешениеАсинх();
Пока РезультатАсинхВызоваВнешнейКомпоненты.Значение Цикл
КодРазрешения = РезультатАсинхВызоваВнешнейКомпоненты.Параметры[0];
ШиринаКартинки = РезультатАсинхВызоваВнешнейКомпоненты.Параметры[1];
ВысотаКартинки = РезультатАсинхВызоваВнешнейКомпоненты.Параметры[2];
Элементы.Разрешение.СписокВыбора.Добавить(
КодРазрешения,
СтрШаблон(
"%1 MP (%2x%3)",
Формат(ШиринаКартинки * ВысотаКартинки / 1000000, "ЧДЦ=2"),
XMLСтрока(ШиринаКартинки),
XMLСтрока(ВысотаКартинки)));
РезультатАсинхВызоваВнешнейКомпоненты = Ждать ОбъектКомпоненты.ПолучитьСледующееРазрешениеАсинх();
КонецЦикла;
Элементы.Разрешение.СписокВыбора.СортироватьПоПредставлению();
Элементы.Разрешение.СписокВыбора.Вставить(0, -1, "По умолчанию");
Разрешение = -1;
КонецПроцедуры
Демо конфигурация
Представляет собой примеры кода в асинхронном режиме. В старом стиле (ОписаниеОповещения) и в новом, для 8.3.18 (async/await).
Позволяет выбрать камеру, разрешение и получить снимок в выбранном формате. Снимок можно сохранить в файл.
Содержит в себе макет с компонентой.