Привет. Я в своей программе на C# столкнулся с задачей получения фотографий с камеры, и нужно было, чтобы пользователь нажимал кнопку в программе, или происходило какое-то программное событие, и мы рррррррррр и получали фото из камеру в программу и потом как-то обработал/сохранил/отправил, в общем что-то программно с ней сделал.
Как оказалось, у производителей цифрозеркальных камер есть специальный SDK, посредством которого можно программно получить доступ и управлять этой самой камерой.
У меня камера Nikon D5200, хотя подобный SDK я вроде тоже видел для Sony и Canon. Цель статьи — рассказать о возможности и показать небольшой пример.
Как известно, если ты знаешь, что что-то можно сделать, то узнать, как это сделать, проще простого.
Итак, что нам нужно: Для начала вам необходимо скачать сам SDK с сайта Nikon: sdk.nikonimaging.com/apply Вам придется зарегистрироваться и стать почетным разработчиком Nikon, причем при регистрации необходимо использовать почтовый ящик организации; общественные почтовые ящики там не принимаются.
Там же вы можете увидеть список поддерживаемых камер; к сожалению, дешевые компактные камеры не поддерживаются.
Во-вторых, для простоты рекомендую использовать уже написанный NikonCSWrapper: sourceforge.net/p/nikoncswrapper/wiki/Главная
Далее создайте свой проект (в Visual Studio), подключите ссылку к обертке Nikon и, внимание: скопируйте в каталог с бинарниками следующие файлы: NkdPTP.dll и Type0009.md3 (здесь номера могут отличаться в зависимости от camera), который можно найти в загруженном SDK.
Теперь небольшой пример, как фотографировать:
Сначала определяем диспетчер устройств: NikonManager manager = new NikonManager("Type0009.md3");
Затем привязываем обработчик события добавления устройства к менеджеру: manager.DeviceAdded += manager_DeviceAdded;
В коде обработчика у меня есть этот текст: void manager_DeviceAdded(NikonManager sender, NikonDevice device)
{
_device = device;
this.Text = _device.Name;
_device.ImageReady += _device_ImageReady;
}
Здесь я сохраняю ссылку на новое устройство и привязываю обработчик к событию ImageReady, которое будет срабатывать, когда камера сделает фото, причем событие вызывается как при команде сделать фото из программы, так и при нажатии кнопка на самой камере.
Мой обработчик событий фотографирования выглядит так: void _device_ImageReady(NikonDevice sender, NikonImage image)
{
MemoryStream ms = new MemoryStream(image.Buffer);
Image img = Image.FromStream(ms);
ms.Close();
pictureBox1.Image = img;
}
Здесь я просто получаю доступ к буферу, в котором находится фотография, и загружаю ее в Image через MemoryStream, который затем отправляю в PictureBox для отображения в форме.
Как вы знаете, с Image обычно можно делать все, что захотите, мой код — всего лишь пример.
Чтобы сделать фото камерой из программного кода, нужно вызвать метод Capture(): _device.Capture();
Ну и при выходе из программы необходимо закрыть диспетчер устройств, иначе вы не сможете к нему подключиться, пока не перезагрузите компьютер: manager.Shutdown();
В общем, через SDK вы можете делать со своей камерой многое: получать и устанавливать любые(?) параметры камеры, фотографировать, снимать видео, фокусироваться автоматически и вручную (из программы), получать живое видео из видоискателя.
На этом у меня все, надеюсь эта информация кому-то пригодится, спасибо за внимание.
Теги: #C++ #.
NET #Nikon #фотография #sdk #api #автоматическое управление #C++
-
Взлом Госуслуг: Мифы И Реальность
19 Oct, 24 -
Выпущена Первая Бета-Версия Django 1.2
19 Oct, 24 -
Ненормальный Agile В Финансах
19 Oct, 24 -
«Мамба» Выходит На Ipo
19 Oct, 24