gifts2017

Native ВК для работы с веб камерой

Опубликовал Виктор Сергиенко (nextkmv) в раздел Программирование - Внешние компоненты

Внешняя компонента для работы с web-камерой. Написана на Delphi и работает по технологии Native API. Компонента позволяет взаимодействовать c web-камерой посредством avicap.dll. Работает в толстом, тонком и веб клиенте(через IE).

Состав архива

[Сборка CAB для IE]  -  инструмент для построения CAB архива расширения для Internet Explorer;

1Cv8.cf - пример работы с компонентой;

Delphi7Source.zip - архив с исходными текстами компоненты;

pacage.zip - архив с компонентой для загузки в макет 1С.

Использование компоненты

Подключение и установка компоненты производится стандартными методами, описанными в синтакс помощнике.

Компонента = Новый("AddIn.Компонента.ExecExtention");

Получение изображения

Получение изображения производится вызовом метода ПолучитьБМП(КодКамеры).

ЗакодированноеИзображение = Компонента.ПолучитьБМП(1);

Параметр КодКамеры - это индекс камеры в системе. Подробнее об этом можно узнать в документации к avicap.dll. Если у вас в системе только одна веб камера оставьте 1.

Поскольку Native API позволяет передавать только простые типы данных (число, строка, булево), передача изображения из компоненты в 1С происходит в виде строки Base64. Соответственно после получения изображения его необходимо сначала преобразовать в двоичные данные.

ДвоичныеДанные = Base64Значение(ЗакодированноеИзображение); // Получаем двоичные данные.

Создаем картинку следующим образом

Фотография = Новый Картинка(ДвоичныеДанные, Ложь); // Создаем картинку

П. С.

Компонента не является готовым решением и лишь иллюстрирует методы взаимодействия с камерой.

За основу взята разработка http://infostart.ru/public/88060/.

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

Наименование Файл Версия Размер Кол. Скачив.
v8nWebCam
.zip 3,69Mb
23.06.15
125
.zip 3,69Mb 125 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Виталий Барилко (Diversus) 06.04.13 12:29
Поскольку Native API позволяет передавать только простые типы данных(число, строка, булево), передача изображения из компоненты в 1С происходит в виде строки Base64.


Вы не правы! Возвращать можно сразу двоичные данные.
Вот работающий пример возвращающий скриншот в формате JPEG с типом ДвоичныеДанные:

function TGraphicsNative.GetScreenShotFunc(RetValue: PV8Variant;
  Params: PV8ParamArray; const ParamCount: Integer;
  var v8: TV8AddInDefBase): Boolean;
Var
  Bitmap: TBitmap;
  jpeg: TJPEGImage;
  Stream: TMemoryStream;
  DC: HDC;
begin
  Bitmap := TBitmap.Create;
  jpeg := TJPEGImage.Create;
  Stream := TMemoryStream.Create;
  try

    Bitmap.Height := Screen.Height;
    Bitmap.Width := Screen.Width;
    DC := GetDC(0);
    Bitblt(Bitmap.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0,
      0, SRCCOPY);
    ReleaseDC(0, DC);

    jpeg.Assign(Bitmap);
    jpeg.CompressionQuality := 80; // Качество JPEG

    jpeg.SaveToStream(Stream);
    Stream.Position := 0;
    V8SetBlob(RetValue, Stream.Memory, Stream.Size); //<< Возвращаем JPEG с типом ДвоичныеДанные

  finally

    // Очищаем память.
    Stream.Free;
    jpeg.Free;
    Bitmap.Free;

  end;

  Result := true;

end;
...Показать Скрыть
2. Виктор Сергиенко (nextkmv) 06.04.13 21:47
3. Виталий Барилко (Diversus) 07.04.13 21:28
(2) Да не за что... Сам промучился с этим долго, пока путем проб и ошибок не получилось.
WaReZ_MEN; +1 Ответить
4. Виктор Сергиенко (nextkmv) 08.04.13 17:14
Очень мало документации, особенно по интеграции в браузеры. Я к сожалению не смог найти информации по внедрению в Chrome, а в FF у меня внедрить так и не получилось. Компонента устаканивалась но при запуске FF говорил что расширение невозможно запустить.
5. Сергей (Che) Коцюра (CheBurator) 03.11.13 02:32
Можно ли ВК использовать в 7.7...?
6. Виктор Сергиенко (nextkmv) 04.11.13 08:38
Нет ВК написана на native API, которая появилась в 8.2. Но для семёрки я где то видел готовую обработку на инфостарте.
7. Виталий Трач (vitalya24) 05.04.14 18:16
клево, супер, я плюсанул. Только вопрос, только у меня не показывается предпросмотр перед тем как сделать снимок или у всех?
8. Виктор Сергиенко (nextkmv) 09.04.14 09:20
(7) vitalya24, Пред просмотр заложен в ВК для удобства, но вы можете переписать ее исходный код прилагается.
9. Константин Попов (Konstatine) 12.08.14 07:23
Спасибо! Огромнейшее! Под тонкий клиент лучшее решение!
10. Виктор Сергиенко (nextkmv) 20.08.14 11:03
Пожалуйста. Правда за время работы выявились некоторые недочеты, в частности компонента корректно работает только если есть одно устройство захвата в системе. Если в системе есть еще устройства, сканер например, то для нормальной работы их приходиться отключать в диспетчере устройств. В планах переписать компоненту с использованием библиотеки opencv на C++. Но это как только время появится.
11. Key-Zed Key-Zed (Key-Zed) 08.09.14 12:54
А как сделать Resize снимка. Ну очень надо.
12. Виктор Сергиенко (nextkmv) 08.09.14 14:25
Логичнее обработку изображения произвести во внешней компоненте, но такого функционала сейчас в ней нет. В 1С штатных механизмов для изменения размеров тоже нет, так что тут придется изобрести определенный велосипед. Я учту пожелания и как дойдут руки до новой версии учту эти пожелания но когда это будет сказать не могу.
13. Константин Попов (Konstatine) 30.01.15 09:39
Добрый день! Посдкажите 2 вопроса: 1) компонента преобразует двоичные данные в картинку. А как задать нужное разрешение картинки? 2) Вы пишите, что эта обработка будет работать в IE. Пожалуйста, распишите подробней процесс настройки в браузере, никак разобраться не могу..
14. Виктор Сергиенко (nextkmv) 30.01.15 14:47
Добрый день!
1) Компонента преобразует картинку в Base64 строку а затем 1С преобразует строку в картинку обратно. Разрешение при этом всегда равно разрешению камеры. Встроенного механизма изменения размера нет. Но вы можете самостоятельно реализовать данный функционал в компоненте, исходный код у вас есть в архиве Delphi7Source.zip.
2) Откройте тестовую конфигурацию в режиме веб клиента в браузере IE. При первом вызове компоненты платформа установит ее в браузер. В тестовой конфигурации вы можете посмотреть как происходит установка компоненты.
15. Константин Попов (Konstatine) 30.01.15 16:42
16. Константин Попов (Konstatine) 30.01.15 20:48
По поводу 2 вопроса..открыл конфигурацию в браузере, при открытии обработки программа спросила установить компоненту? После нажатия ДА выходит сообщение: "Установка внешней компоненты не выполнена. В процессе установки произошла ошибка." Подскажите с чем это может быть связано? Или может можно как-то вручную установить эту компоненту? Благодарю.
17. Виктор Сергиенко (nextkmv) 31.01.15 14:55
Трудно сказать но я думаю что проблема скорее всего в настройках безопасности в IE. Нужно разрешить в настройках безопасности IE использование внешних компонент в том числе Activex.
Так же обращаю ваше внимание что компонента не является готовым решением а лишь демонстрирует механизм работы с камерой из Delphi(через вызовы WinAPI) и взаимодействие с 1С по технологии Native API, так же она не тестировалась на работу со всеми версиями платформы 1С и браузера IE. И используете вы ее на свой страх и риск.
18. Константин Попов (Konstatine) 19.02.15 08:10
Подскажите, удавалось ли Вам установить компоненту в браузере? Если да, то какая у Вас версия IE? Настройки безопасности на самом низком уровне, но установить не получается. Спасибо.
19. Константин Попов (Konstatine) 19.02.15 16:03
...или может ее можно установить вручную (т.е. скачать, распаковать)?
20. Алексей Мальцев (Prooa) 26.02.15 05:32
(19) Интересует этот же вопрос.
21. Константин Попов (Konstatine) 04.03.15 08:54
(17) nextkmv, подскажите, вопрос так и не решился.
22. Dima Dima (bayce) 27.07.15 23:39
Компонента хорошая.
Но если бы можно улучшить ее.
Есть компонента с хорошим функционалом, но к сожалению работает не стабильно.
http://infostart.ru/public/341805/#comm
23. Виктор Сергиенко (nextkmv) 29.07.15 10:02
Компонента писалась довольно давно, с тех пор много что изменилась(Например кросплатформенность и мобильная платформа). В принципе я могу начать разработку новой версии, с учетом новых требований. Пишите свои пожелания а я попробую их реализовать.
Я бы добавил следующие возможности:
- Возможность настройки разрешения снимка;
- Возможность снимать видео;
- Возможность подключения проффесиональных цифровых камер для съемки номенклатуры;
- Возможность быстрой съемки, в один клик;
- Работа в толстом, тонком, web клиенте(укажите какие браузеры востребованы, так как для каждого требуется своя сборка), возможно мобильная версия компоненты(фотографируем на телефон выгружаем в основную ИБ);
- Возможно нужен функционал распознования изображений, например QR кода на коробках.
Пишите свои предложения, желательно в порядке приоритетности реализации.
24. Игорь Панченко (igorekpanchenko) 29.07.15 10:40
Добрый день!
Помогите пожалуйста разобраться, почему форма не сохраняет полученное изображение.

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Если АдресКартинки <> Неопределено Тогда 
		Данные = ПолучитьИзВременногоХранилища(АдресКартинки);
		ТекущийОбъект.Файл = Новый ХранилищеЗначения(Данные);
	КонецЕсли;
	Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
        ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресКартинки);
        ТекущийОбъект.Файл = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	ЭтотОбъект = РеквизитФормыВЗначение("Объект");
	АдресКартинки = ПоместитьВоВременноеХранилище(ЭтотОбъект.Файл.Получить(), Новый УникальныйИдентификатор);
	АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "Фото");
КонецПроцедуры

&НаКлиенте
Процедура Сканировать(Команда)
	
	Image = Новый COMОбъект("WIA.ImageFile"); 
	DevManager = Новый COMОбъект("WIA.CommonDialog"); 
	Image = DevManager.ShowAcquireImage();
	IP = Новый COMОбъект("WIA.ImageProcess");
	IP.Filters.Add(IP.FilterInfos("Convert").FilterID);
	IP1 = IP.Filters(1);
	Для К = 1 По IP1.Properties.Count Цикл
		Если IP1.Properties(К).Name = "FormatID" Тогда
			IP1.Properties(К).Value = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Image = IP.Apply(Image);
	СохранитьИВывестиИзображение();
			
КонецПроцедуры

&НаКлиенте
Процедура СохранитьИВывестиИзображение()
	УдалитьФайлы(ИмяФайла); //удалим старый файл
    Image.SaveFile(ИмяФайла); //сохраним на жесткий диск объект WIA		
	АдресВХранилище = ""; //Помещаем картинку в хранилище
	ПоместитьФайл (АдресВХранилище, "C:\CurCertificate.png", , Ложь) ; //Помещаем картинку в хранилище
	АдресКартинки = АдресВХранилище; //Вставляем из хранилища
КонецПроцедуры

////////////////////////////////////////////////////////////­/////

&НаКлиенте
Процедура СделатьСнимок(Команда)
	// Получим объект формы работы с камерой
	ФормаОбработки = ПолучитьФорму("Обработка.РаботаСВебКамерой.Форма.Форма");
	// Для того чтобы ссылка на картинку во временном хранилище удалялась после 
	// закрытия формы справочника, а не формы обработки передадим последней УникальныйИдентификатор
	// формы справочника
	ФормаОбработки.СсылкаВладелец = УникальныйИдентификатор;
	// Откроем окно обработки
	Результат = ФормаОбработки.ОткрытьМодально();
	// Если фотография сделана отобразими её на форме
	Если Результат = КодВозвратаДиалога.Да Тогда 
		АдресКартинки = ФормаОбработки.СсылкаКартинки;
		Модифицированность = Истина;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
        УдалитьИзВременногоХранилища(АдресКартинки);
    КонецЕсли;
    АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "Фото");
КонецПроцедуры
...Показать Скрыть

Прикрепленные файлы:
25. Key-Zed Key-Zed (Key-Zed) 21.08.15 13:25
(23) nextkmv, Дерзай, очень жду.
К списку предложений привинтить работу со сканером.
26. Константин Попов (Konstatine) 19.09.15 17:22
Подскажите пожалуйста такой вопрос:
Внезапно на нескольких компьютерах начала выходить ошибка: "Не найден файл внешней компоненты".
Помогает перезагрузка. С чем такое может быть связано? Куда копать?
Саму внешнюю компоненту еще раз у вас скачал и заменил макет, но не помогло.
Благодарен за любой дельный совет.
27. Виктор Сергиенко (nextkmv) 20.09.15 13:51
(26) Konstatine, странная ситуация. Попробуйте обновить платформу 1С.
28. Александр Медведев (anig99) 30.11.15 10:58
Спасибо! Работает даже на XP под 8.3
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа