Получение фото с веб-камеры

Публикация № 1215423

Разработка - Разработка внешних компонент

фото компонента веб-камера

Получение фото с веб-камеры без ActiveX. Внешняя компонента по технологии Native API.

В платформе 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.

Методы компоненты
  • ПолучитьКоличествоУстройств (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();
КонецПроцедуры

&НаКлиенте
Процедура ПодключитьКомпонентуWebCam(Знач ЭтоУстановка = Ложь)
	ОповещениеОПодключении = Новый ОписаниеОповещения("ОповещениеОПодключении", ЭтотОбъект, ЭтоУстановка);
	НачатьПодключениеВнешнейКомпоненты(ОповещениеОПодключении, "ОбщийМакет.WebCam", "WebCam", ТипВнешнейКомпоненты.Native);
КонецПроцедуры

&НаКлиенте
Процедура ОповещениеОПодключении(Подключено, ЭтоУстановка) Экспорт
	Если Подключено Тогда
		ОбъектКомпоненты = Новый("AddIn.WebCam.WMFPictures");
...
	ИначеЕсли ЭтоУстановка Тогда
		ПоказатьПредупреждение(, "Ошибка установки внешней компоненты.");
	Иначе
		ОповещениеОЗапросеУстановки = Новый ОписаниеОповещения("ОповещениеОЗапросеУстановки", ЭтотОбъект);
		ПоказатьВопрос(
			ОповещениеОЗапросеУстановки,
			"Для возможности захвата изображений требуется установить внешнюю компоненту.
			|Выполнить установку?",
			РежимДиалогаВопрос.ДаНет);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОповещениеОЗапросеУстановки(РезультатВопроса, ДополнительныеПараметры) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		ОповещениеОбУстановке = Новый ОписаниеОповещения("ОповещениеОбУстановке", ЭтотОбъект);
		НачатьУстановкуВнешнейКомпоненты(ОповещениеОбУстановке, "ОбщийМакет.WebCam");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОповещениеОбУстановке(ДополнительныеПараметры) Экспорт
	ПодключитьКомпонентуWebCam(Истина);
КонецПроцедуры
Пример получения списка разрешений
&НаКлиенте
Процедура ОбновитьСписокРазрешений();
	Элементы.Разрешение.СписокВыбора.Очистить();

	ОповещениеОВызовеМетода = Новый ОписаниеОповещения("ОповещениеОВызовеМетодаВыбратьРазрешения", ЭтотОбъект);
	ОбъектКомпоненты.НачатьВызовВыбратьРазрешения(ОповещениеОВызовеМетода, ТекущаяКамера);
КонецПроцедуры

&НаКлиенте
Процедура ОповещениеОВызовеМетодаВыбратьРазрешения(Результат, ПараметрыВызова, ДополнительныеПараметры) Экспорт
	ОповещениеОВызовеМетода = Новый ОписаниеОповещения("ОповещениеОВызовеМетодаПолучитьСледующееРазрешение", ЭтотОбъект);
	ОбъектКомпоненты.НачатьВызовПолучитьСледующееРазрешение(ОповещениеОВызовеМетода);
КонецПроцедуры

&НаКлиенте
Процедура ОповещениеОВызовеМетодаПолучитьСледующееРазрешение(Результат, ПараметрыВызова, ДополнительныеПараметры) Экспорт
	Если Результат Тогда
		КодРазрешения	= ПараметрыВызова[0];
		ШиринаКартинки	= ПараметрыВызова[1];
		ВысотаКартинки	= ПараметрыВызова[2];

		Элементы.Разрешение.СписокВыбора.Добавить(
			КодРазрешения,
			СтрШаблон(
				"%1 MP (%2x%3)",
				Формат(ШиринаКартинки * ВысотаКартинки / 1000000, "ЧДЦ=2"),
				XMLСтрока(ШиринаКартинки),
				XMLСтрока(ВысотаКартинки)));

		ОповещениеОВызовеМетода = Новый ОписаниеОповещения("ОповещениеОВызовеМетодаПолучитьСледующееРазрешение", ЭтотОбъект);
		ОбъектКомпоненты.НачатьВызовПолучитьСледующееРазрешение(ОповещениеОВызовеМетода);
	Иначе
		Элементы.Разрешение.СписокВыбора.СортироватьПоПредставлению();
		Элементы.Разрешение.СписокВыбора.Вставить(0, -1, "По умолчанию");

		Разрешение = -1;
	КонецЕсли;
КонецПроцедуры
Демо конфигурация

Представляет собой примеры кода в асинхронном режиме.

Позволяет выбрать камеру, разрешение и получить снимок в выбранном формате. Снимок можно сохранить в файл.

Содержит в себе макет с компонентой.

Скачать файлы

Наименование Файл Версия Размер
Внешняя компонента

.zip 129,17Kb
24.03.20
13
.zip 1.0.0.6 129,17Kb 13 Скачать
Демо конфигурация

.zip 147,01Kb
24.03.20
14
.zip 1.0.0.6 147,01Kb 14 Скачать
Исходники внешней компоненты

.zip 16,19Kb
24.03.20
1
.zip 1.0.0.6 16,19Kb 1 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. user5300 518 25.03.20 11:36 Сейчас в теме
не выводит изображение в 1С:Предприятие 8.3 (8.3.13.1644)..

хотя должен, в чем может быть проблема ?
2. berezdetsky 567 25.03.20 18:23 Сейчас в теме
(1) Проверил, в демо конфигурации картинка не выводится, но при сохранении двоичных данных в файл .bmp получается корректное изображение.
Могу поразбираться, если критично, но похоже на баг демо конфигурации или платформы.
3. user5300 518 26.03.20 07:51 Сейчас в теме
(2) я так думаю что из-за размера картинка, у меня получается примерно 4-10 мб, если урезать до 1 мб или меньше то корректно выводится...
Есть ли параметры для уменьшения разрешения камеры у компоненты ?
4. berezdetsky 567 26.03.20 09:16 Сейчас в теме
(3) Скорее дело в том, что я не заполняю ряд необязательных полей в заголовке файла, а 8.3.13 их считает обязательными. Постараюсь разобраться до конца следующей недели.
Установка разрешения в планах тоже есть.

А обновить платформу не вариант? :-)
5. user5300 518 26.03.20 09:40 Сейчас в теме
(4)Не вариант )
Много старых конф связаны с этой платформой(

Так что ждем решений )
6. berezdetsky 567 26.03.20 20:24 Сейчас в теме
(5) Исправлено в 1.0.0.2.

Суть в том, что в RGB32 в точке три байта обозначают цвет и один байт зарезервирован (используется в RGBA). API заполняет этот байт нулём. А эти весёлые чудаки из 1С в 8.3.13 и, возможно, в более ранних, трактуют этот байт как прозрачность. В 1.0.0.2 я заполняю его 0xFF и картинка выводится.
Твой редактор при урезании скорее всего делает то же самое или уменьшает цветность до 24 бит.
7. nuctoh 27 26.03.20 21:47 Сейчас в теме
Вопрос получения изображений с вебкамеры решается гораздо проще с помощью стандартного виндового WIA-драйвера и несложной модификации подсистемы РаботаСФайлам из БСП
https://infostart.ru/public/861841/
8. berezdetsky 567 27.03.20 09:38 Сейчас в теме
(7) Ага. Только x86, наличие БСП, тормозные COM-интерфейсы, километры кода - это, конечно, гораздо проще, чем
ПодключитьВнешнююКомпоненту("ОбщийМакет.WebCam", "WebCam", ТипВнешнейКомпоненты.Native);
ОбъектКомпоненты = Новый("AddIn.WebCam.WMFPictures");
ДвоичныеДанные = ОбъектКомпоненты.ПолучитьКартинку(0);

:D
9. gradi 5 15.06.20 15:21 Сейчас в теме
(8) Скачал компоненту. При получении изображения ничего не выдает (в просмотре картинки просто черный прямоугольник). Не подскажете в чем может быть проблема?
10. berezdetsky 567 16.06.20 09:22 Сейчас в теме
(9) Шторка камеры закрыта? :) Тебя нет в списке скачавших, мы точно об этой компоненте говорим?
Пришли мне файл bmp с двоичными данными из компоненты на посмотреть. И версии используемых 1С и Windows.
11. gradi 5 16.06.20 15:04 Сейчас в теме
(10)
И версии используемых 1С и Windows.

8.3.13.1513
вин 10

(10)
Пришли мне файл bmp с двоичными данными из компоненты на посмотреть.

Прикрепил.
Прикрепленные файлы:
12. berezdetsky 567 16.06.20 21:30 Сейчас в теме
13. Vix 27 22.06.20 16:13 Сейчас в теме
Скачал, действительно км. текста писать не нужно, но картинка с камеры обновляется 1 раз в 3 сек, напоминает жуткие лаги. Я подозреваю, что нужно где-то частоту кадров выставить, но где?
14. berezdetsky 567 23.06.20 09:41 Сейчас в теме
(13) Там нет частоты кадров. Компонента предназначена для получения одного кадра.
Задержка возникает из-за того, что и инициализация подсистем API и оборудования и выключение всего этого находится внутри метода ПолучитьКартинку. Задачи снять видеопоток не было, по этому сделано так.
+ вывод картинки через хранилище значения добавляет к задержке серверный вызов.
В тех сценариях, для которых компонента изначально создавалась, её производительность приемлемая.
15. Vix 27 23.06.20 11:16 Сейчас в теме
(14)понял, спасибо за разъяснение.
16. Лик2 23 22.07.20 12:16 Сейчас в теме
Добрый день! Помогите разобраться с ошибкой!
Прикрепленные файлы:
17. berezdetsky 567 22.07.20 12:22 Сейчас в теме
(16) А что там в "Подробно"? В каком методе ошибка возникает?
18. Лик2 23 22.07.20 12:26 Сейчас в теме
1С:Предприятие 8.3 (8.3.16.1296) Win 7 prof.
Прикрепленные файлы:
19. berezdetsky 567 22.07.20 13:50 Сейчас в теме
(18) Супер. :) А метод то какой?
20. Лик2 23 22.07.20 13:53 Сейчас в теме
(19)Я пробую из демки которую скачал подключиться к камере и получить изображение, у меня вылазит ошибка. Что я не так сделал!
21. berezdetsky 567 22.07.20 14:36 Сейчас в теме
(20) Всё так. Просто, чтобы я мог помочь, мне нужно понимать, в каком вызове происходит эта ошибка. Напиши, хотя бы, это при нажатии "Получить картинку" или раньше?
22. Лик2 23 22.07.20 14:39 Сейчас в теме
(21)Да. Все верно при нажатии кнопки "Получить картинку". Ошибка!
23. berezdetsky 567 22.07.20 21:39 Сейчас в теме
(22) Если есть время поиграться с отладочными версиями, пришли мне в личку свой e-mail.
24. Лик2 23 23.07.20 12:14 Сейчас в теме
(23) Время есть, e-mail отправил!
Оставьте свое сообщение

См. также

daСклонение: склонение ФИО, должностей, чисел, прилагательных, существительных на языке 1С + ТестЦентр Промо

Универсальные функции v8 1cv8.cf Абонемент ($m)

Функция предназначена для склонения выражений, которые часто требуется при формировании печатных форм договоров и прочих печатных форм. Функция склоняет по падежам ФИО, должности, числительные, валюты, единицы измерения, предметы. Также функция склоняет глаголы и прилагательные по числам и родам и существительные по числам. Имеется режим определения рода переданного выражения. Поддержка форматной строки для вывода результата. Функция не использует внешние библиотеки и веб-сервисы, написана на чистом языке 1С, и поэтому легко встраивается в любую конфигурацию или внешнюю обработку. Правила склонения оформлены в виде таблицы и могут быть легко изменены при необходимости.

1 стартмани

14.02.2015    102116    97    daMaster    90    

Сравнение реального дохода со средним доходом из API.HH.RU

Зарплата Управленческие v8 v8::СПР ЗУП3.x УУ Абонемент ($m)

Внешняя обработка на управляемой форме для 1С:Предприятие 8.3 по интеграции с HH.RU используя HH REST API. Ключевые функции: получение списка вакансий по должностям (Ключ для работы не нужен); расчет среднего дохода; Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.13.1513) Зарплата и управление персоналом, редакция 3.1 (3.1.11.68) совместно с API.HH.RU.

1 стартмани

11.11.2019    3956    4    solaru    2    

Конфигурация для рекламного агентства

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) v8 Реклама, PR и маркетинг УУ Абонемент ($m)

Данная конфигурация выполнена для решения тестового задания: Цель задания: 1) Понять, на каком из клиентов сколько мы заработали;  2) Понять, по какому виду СМИ сколько мы заработали;  3) Проследить по каждой услуге: у кого за сколько купили и кому за сколько продали, с возможностью перейти в соответствующий документ. Реализовано с помощью: 1. Справочники - контрагенты, номенклатура 2. Документы - Поступление услуг, реализация услуг 3. Отчеты - отчет по контрагентам, номенклатуре и движений.

1 стартмани

21.05.2019    4615    0    solaru    0    

Загрузка номенклатуры в УТ 10.3 из Excel файла с генерацией штрихкодов

Загрузка и выгрузка в Excel Обработка справочников Оптовая торговля Розничная торговля Учет ТМЦ Оптовая торговля Розничная торговля Учет ТМЦ v8 УТ10 Россия Абонемент ($m)

Обработка позволяет генерировать новые номенклатурные позиции на основе данных из файла Excel с последующей генерацией штрихкодов (ШК). Может быть полезна при больших поступлениях товаров на склад, где ручное создание и присваивание штрихкода  (ШК) может занимать много времени.

1 стартмани

24.03.2017    7828    7    solaru    0    

Под капотом управляемых форм

Практика программирования v8 1cv8.cf Бесплатно (free)

Управляемые формы уже давно и плотно вошли в жизнь 1С-разработчика. Однако, судя по недавним публикациям на Инфостарте, многие до сих пор мало знакомы с ними. Предлагаю разобраться с тем, что же это такое.

26.08.2013    265576    Evil Beaver    266    

[NotaBene] Универсальный отчет по таблице значений

Практика программирования v7.7 1cv7.md Россия Абонемент ($m)

1C v.7.7 Готовое решение. Не требует настройки. Не требует допрограммирования. Данная обработка решает часто встречающуюся задачу вывода в "красивом" виде таблицы значений (полученной, например, из запроса). Поддерживается произвольное группирование данных, отключение/включение группировок, в т.ч и создание "шахматок" (типа "продажи понедельно"). Обработка может использоваться как и в отладочных целях (для нормального просмотра ТЗ), так и в составе вполне рабочих отчетов. По крайней мере, я неоднократно клиентам данную обработку ставил вместо того, чтобы каждый раз писать замороченные выводы данных. И клиенты довольны, и мне - проще...

2 стартмани

07.05.2007    28820    3    CheBurator    63