В платформе 8.3.14 движок поля HTML документа был заменён с MS IE на WebKit. Это привело к отвалу ряда подобных решений, основанных на технологии ActiveX.
Из аналогов можно упомянуть публикацию Native ВК для работы с веб камерой, основанную на самом старом из распространённых API - Video for Windows.
Технические детали
Написано на MS Visual C++ 2019.
Используемые 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 на Windows 8+ и RGB32 на Windows 7).
- 1 - gif
- 2 - jpeg
- 3 - png
- 4 - tiff
- качество (степень сжатия). Используется только для формата jpeg. Допустимые значения - от 0 до 100. Значение по умолчанию = 75.
- код разрешения (media type index). Используется для установки разрешения кадра. Допустимые значения - Неопределено или число. Нумерация с нуля. Значение по умолчанию = Неопределено, что соответствует коду разрешения, установленному в драйвере камеры по умолчанию.
- номер кадра. Номер кадра в потоке. Нумерация с единицы. Значение по умолчанию = 1. Предназначен для камер, которые не успевают выполнить автонастройку до получения первого кадра.
- ВыбратьРазрешения (SelectMediaTypes): инициализирует выборку доступных разрешений камеры. Один параметр - номер устройства. Нумерация с нуля. Значение по умолчанию - ноль. Возвращаемого значения нет.
- ПолучитьСледующееРазрешение (GetNextMediaType): получает следующее доступное разрешение камеры. Работает быстрее и правильнее (с точки зрения API), чем устаревший метод ПолучитьРазрешение. Возвращает булево. Истина = разрешение получено, Ложь = выборка завершена. Три выходных параметра возвращают число:
- код разрешения.
- ширина кадра.
- высота кадра.
- ПолучитьКоличествоРазрешений (GetMediaTypesCount): возвращает число - количество типов среды (media type), поддерживаемых драйвером. В общем случае их больше, чем количество именно разрешений. Один параметр - номер устройства. Нумерация с нуля. Значение по-умолчанию - ноль.
- ПолучитьРазрешение (GetMediaType): позволяет получить разрешение, соответствующее переданному коду. Возвращает число - следующий код с уникальным разрешением или Неопределено, если разрешения кончились. Четыре параметра:
- номер устройства. Нумерация с нуля. Значение по умолчанию - ноль.
- код разрешения. Значение по умолчанию - Неопределено. Если параметр не передан, метод получает разрешение камеры по умолчанию и возвращает Неопределено.
- ширина кадра. Выходной параметр.
- высота кадра. Выходной параметр.
- частота кадров. Выходной параметр.
- формат точки. Выходной параметр. Формат точки в исходнике (FOURCC code).
- ПолучитьОписаниеНастройки (ControlGetRange): возвращает булево. Ложь значит, что камера данную настройку не поддерживает.
- номер устройства. Нумерация с нуля. Значение по умолчанию - ноль.
- код настройки. Список кодов см. ниже.
- минимальное значение. Выходной параметр.
- максимальное значение. Выходной параметр.
- шаг. Выходной параметр.
- значение по умолчанию. Выходной параметр.
- автонастройка поддерживается. Выходной параметр.
- ПолучитьНастройку (ControlGet): возвращает текущее значение настройки. Если автонастройка включена, метод возвращает значение по умолчанию.
- номер устройства. Нумерация с нуля. Значение по умолчанию - ноль.
- код настройки. Список кодов см. ниже.
- автонастройка. Выходной параметр.
- УстановитьНастройку (ControlSet): устанавливает Значение, если Автонастройка = ложь. Включает автонастройку, если Автонастройка = Истина (при этом Значение игнорируется). Значение параметра Автонастройка по умолчанию = ложь.
- номер устройства. Нумерация с нуля. Значение по умолчанию - ноль.
- код настройки. Список кодов см. ниже.
- значение.
- автонастройка.
В асинхронном режиме с оповещениями, соответственно, нужно вызывать методы НачатьВызов<ИмяМетода>() с передачей описания оповещения в первом параметре. Обработчики оповещения получают три параметра: Результат, ПараметрыВызова, ДополнительныеПараметры.
Управление настройками
Методы управления настройками добавлены в предположении, что отключение автонастройки может ускорить получение фото нужного качества.
Значения настроек всегда целочисленные. Описание настроек можно прочитать в первоисточнике:
- настройки камеры (коды 0..6): CameraControlProperty | Microsoft Docs
- настройки изображения (коды 1000..1009): VideoProcAmpProperty | Microsoft Docs
Определение структуры с кодами настроек
Новый ФиксированнаяСтруктура(
"Панорамирование, Наклон, Прокрутка, Масштабирование, Выдержка, Диафрагма, Фокус, Яркость, Контраст, Оттенок, Насыщенность, Чёткость, Гамма, Цветность, БалансБелого, КомпенсацияПодсветки, Усиление",
0, 1, 2, 3, 4, 5, 6, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009)
Пример подключения
&НаКлиенте
Асинх
Процедура ПриОткрытии(Отказ)
Подключено = Ждать ПодключитьКомпоненту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).
Позволяет выбрать камеру, разрешение и получить снимок в выбранном формате. Снимок можно сохранить в файл.
Настройки камеры на форме не появятся, если версия платформы ниже, чем 8.3.18 или если у камеры нет поддерживаемых настроек.
Содержит в себе макет с компонентой.